QLabel上的QPixmap无法正确显示

时间:2013-07-25 14:50:22

标签: c++ qt

我正在尝试使用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-&gt; update()但它不会改变任何东西..

编辑:

它应该是一个动画。我通过QTimer获得动画工作,每隔n毫秒调用绘制函数(而不是作为答案建议的paintEvent)

1 个答案:

答案 0 :(得分:5)

  1. 只有在绘画时才需要QPainter的实例。您不需要将其保留为类成员。
  2. Pixmap可以声明为类成员,而不是指针。
  3. 油漆应该做一次。在paintEvent中绘制外部像素图是个坏主意,因为你不知道什么时候会调用paintEvent(以及多少次)。
  4. 您不能为paint事件中的标签设置pixmap,因为调用l-&gt; setPixmap会强制您的窗口小部件更新=&gt;你会得到无限循环的draw-&gt; set-&gt; update-&gt; draw ...
  5. 解决方案:

    1. 在某处创建一个像素图并在其上绘制必要的内容。
    2. 在必要时(例如,绘图后)将内容设置为标签。
    3. 不要调用update() - 当你将pixmap设置为label时,它会被自动调用。
    4. 已编辑的代码: 编辑问题的简单类:

      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 );
      }