QLabel 上的 QPixmap 无法正确显示
Posted
技术标签:
【中文标题】QLabel 上的 QPixmap 无法正确显示【英文标题】:QPixmap on QLabel doesn't show correctly 【发布时间】:2013-07-25 14:50:22 【问题描述】:我正在尝试使用QPainter
类绘制一些形状并将其保存到磁盘。据我所知,最简单的方法是使用QPainter
绘制到QPixmap
,通过QLabel
在像素图中可视化,然后使用QPixmap::save
。
但是当我运行这个测试时,我只看到 QWidget 内部有一个小黑框。
MyWidget::MyWidget()
std::cout << "MyWidget > ." << std::endl;
l = new QLabel();
l->setParent(this);
pixmap = new QPixmap(460, 480);
painter = new QPainter(pixmap);
MyWidget::~MyWidget()
delete pixmap;
delete painter;
void MyWidget::paintEvent(QPaintEvent *event)
std::cout << "dudee" << std::endl;
painter->begin(pixmap);
painter->drawLine(1,1,100,100);
QPen myPen(Qt::black, 2, Qt::SolidLine);
painter->setPen(myPen);
painter->drawLine(100,100,100,1);
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(QPen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap));
painter->setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter->drawEllipse(200, 80, 400, 240);
painter->end();
l->setPixmap(*pixmap);
我尝试添加一些 l->update() 但它没有改变任何东西..
编辑:
应该是动画。我通过一个 QTimer 获得动画工作,该 QTimer 每隔 n 毫秒调用一次绘图函数(而不是答案建议的 paintEvent)
【问题讨论】:
为什么要在paintEvent 中的像素图上绘图?您对小部件进行递归重绘。 我认为paintEvent 是正确的绘画场所.. 明白了! 【参考方案1】:-
只有在绘画时才需要 QPainter 的实例。您无需将其保留为班级成员。
Pixmap 可以声明为类成员,而不是指针。
应该涂一次。在paintEvent 中绘制外部像素图是个坏主意,因为您不知道何时调用paintEvent(以及调用多少次)。
您不能为绘图事件中的标签设置像素图,因为调用 l->setPixmap 会强制您的小部件更新 => 您将获得无限循环的 draw->set->update->draw...李>
解决方案:
-
在某处创建像素图并在其上绘制必要的内容。
在必要时(例如,在绘制之后)将内容设置为标签。
不要调用 update() - 当您将 pixmap 设置为 label 时,它会自动调用。
编辑代码: 编辑问题的简单类:
AnimationSample.h
#ifndef ANIMATIONSAMPLE_H
#define ANIMATIONSAMPLE_H
#include <QWidget>
#include <QPixmap>
#include <QLabel>
#include <QPointer>
#include <QTimer>
class AnimationSample
: public QWidget
Q_OBJECT
public:
AnimationSample( QWidget *parent = NULL );
~AnimationSample();
private slots:
void onTick();
private:
QPointer< QLabel > m_label;
QPointer< QTimer > m_timer;
int m_salt;
;
#endif // ANIMATIONSAMPLE_H
AnimationSample.cpp
#include "AnimationSample.h"
#include <QPixmap>
#include <QPainter>
AnimationSample::AnimationSample( QWidget *parent )
: QWidget( parent )
, m_salt( 1 )
m_label = new QLabel( this );
m_label->setFixedSize( 100, 100 );
m_timer = new QTimer( this );
connect( m_timer, SIGNAL( timeout() ), SLOT( onTick() ) );
m_timer->start( 250 );
AnimationSample::~AnimationSample()
void AnimationSample::onTick()
QPixmap pic( 100, 100 );
QPainter p( &pic );
QPen myPen( Qt::black, 2, Qt::SolidLine );
p.setPen( myPen );
p.drawLine( 0, 0, m_salt, m_salt );
m_salt = (m_salt + 1) % 100;
m_label->setPixmap( pic );
【讨论】:
因为它应该是一个动画(为简单起见,这里没有粘贴所有代码).. @nkint 请用此注释编辑原始帖子 - 这是您问题中最重要的事情。 漂亮而清晰,我认为绘画活动是正确的地方。为什么像素图不是指针? 为什么它没有告诉我发生了非常糟糕的无限循环?? 基本上没关系,为什么不用指针,但它有助于保持RAII原则。等一下,我给你做个动画样例。以上是关于QLabel 上的 QPixmap 无法正确显示的主要内容,如果未能解决你的问题,请参考以下文章