【问题标题】:Basic Qt GUI: QPushButton for Drawing a line基本 Qt GUI:用于绘制线条的 QPushButton
【发布时间】:2011-11-02 02:28:29
【问题描述】:

我想在单击绘制按钮时绘制一个网格(一系列线条),并希望在单击清除按钮时将它们清除。

我让网格显示为独立程序,但我不知道如何将它与 QPushButton 结合使用。

在程序运行时单击“绘图”按钮时收到以下消息。

"QPainter::begin: 绘制设备返回引擎 == 0,类型:1 QPainter::setPen: Painter 未激活"

谢谢

#include <QtGui> 
#include <QPainter>
#include "myqtapp.h"

// including <QtGui> saves us to include every class user, <QString>, <QFileDialog>,...

myQtApp::myQtApp(QWidget *parent)
{
    setupUi(this); // this sets up GUI

        // signals/slots mechanism in action
        connect( pushButton_draw, SIGNAL( clicked() ), this, SLOT( draw() ) );
    connect( pushButton_clear, SIGNAL( clicked() ), this, SLOT( clear() ) ); 
    connect( pushButton_about, SIGNAL( clicked() ), this, SLOT( about() ) ); 
}



void myQtApp::draw()
{
    //draw the grid

    int lineSpacing(30),// line spacing in pixels
            numberOfLines;

    QPen pen(Qt::black, 2, Qt::SolidLine);

    QPainter painter(this);
    painter.setPen(pen);

    //Grid takes up at most a 400x400 area starting at (right 150, down 50) from upper left
    numberOfLines = 400/lineSpacing; //Round down grid size to fit in 400x400
    for(int i = 0; i<numberOfLines; i++){
        painter.drawLine(150, 50+i*lineSpacing, 150+(numberOfLines-1)*lineSpacing, 50+i*lineSpacing);
        painter.drawLine(150+i*lineSpacing, 50, 150+i*lineSpacing, 50+(numberOfLines-1)*lineSpacing );
    }

}

【问题讨论】:

    标签: qt


    【解决方案1】:

    您遇到的问题是因为您试图在小部件的 paintEvent() 调用之外使用 QPainter 在 UI 上绘图 - 来自 Qt 文档:

    QPainter 的常见用途是在小部件的绘制事件中:构造 并自定义(例如设置钢笔或画笔)画家。然后画。 画完后记得销毁QPainter对象。

    如果您尝试在paintEvent() 调用之外的小部件上绘图,结果是不可预测的。

    这样做的正确方法是这样的:

       // myQtApp.h
       class myQtApp : public QWidget
       {
       Q_OBJECT
       public:
          myQtApp(QWidget *parent = 0); // Constructor as you have
       protected:
          void paintEvent(QPaintEvent *event); // This is re-implemented from QWidget
       protected slots:
          void draw();
       private:
          bool drawTheLines;
       }
    

       // myQtApp.cpp
       void myQtApp::paintEvent(QPaintEvent *event)
       {
          QPainter painter(this);
    
          if(drawTheLines)
          {
             // Do the drawing here - as in your current draw() function
          }
    
          QWidget::paintEvent(event); // call the base class so everything else is drawn OK
       }
    
    
       void draw();
       {
          drawTheLines = true;
          update(); // This forces a repaint of the widget with paintEvent()
       }
    

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2018-10-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多