繁体   English   中英

QLabel上的QPixmap无法正确显示

[英]QPixmap on QLabel doesn't show correctly

我试图用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获得动画工作,该动画每隔n毫秒调用一次绘制函数(不是paintEvent作为答案的建议)

  1. 您仅在绘画时才需要QPainter实例。 您无需将其保留为班级成员。
  2. Pixmap可以声明为类成员,而不是指针。
  3. 油漆应该做一次。 在paintEvent内绘制外部像素图是个坏主意,因为您不知道何时确切调用paintEvent(以及调用多少次)。
  4. 您不得在paint事件中为标签设置像素图,因为调用l-> setPixmap会强制您的小部件进行更新=>您将获得绘制->设置->更新->绘制的无限循环...

解:

  1. 在某处创建一个像素图,并在其上绘制必要的内容。
  2. 必要时(例如在绘制后)将内容设置为标签。
  3. 不要调用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 );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM