【问题标题】:How to draw something with QPainter when the button is pushed按下按钮时如何使用QPainter绘制东西
【发布时间】:2020-05-05 21:06:17
【问题描述】:

我正在从编程开始我的项目,例如,每次使用 QPainter 按下按钮时,我都需要绘制一个圆圈。这是第一个问题,这里的第二个问题是我也需要将一些信息发送到绘图函数,例如 int 向量,并且能够绘制这么多圆,因为向量中有具有半径的元素元素本身。我发现了一些基于信号和插槽的代码。
发件人:

public:
    Listener(QObject *p = 0) : QObject(p) {
        QTimer * t = new QTimer(this);
        t->setInterval(200);
        connect(t, SIGNAL(timeout()), this, SLOT(sendData()));
        t->start();
    }
signals:
    void dataAvaiable(int, int);

public slots:
    void sendData() {
        emit dataAvaiable(qrand() % 200, qrand() % 200);
    }

收件人:

    void receiveData(int x, int y) {
        QPainter painter(this);
        QPen pen(Qt::white, 5);
        painter.setRenderHint(QPainter::HighQualityAntialiasing);
        painter.setPen(pen);
        QPoint point(x, y);
        painter.drawEllipse(x, y, 100, 100);
        data.append(point);
    }

main.cpp 中的连接本身

QObject::connect(&l, SIGNAL(dataAvaiable(int,int)), &w, SLOT(receiveData(int,int)));

但是代码不适合我的按钮任务,甚至不想画任何东西,只是任何圆圈。但是,在调试器中,代码可以正确执行,而且我对 Qt 和 C++ 还比较陌生,所以我无法自己弄清楚问题出在哪里以及如何解决我的任务。
有人可以做最少的代码吗或者简单地向我解释,问题到底出在哪里?需要尽快解决问题。谢谢。

更新:无论有没有 QPainter,任何可能的解决方案现在都很好。

【问题讨论】:

    标签: qt qpainter


    【解决方案1】:

    Qt 论坛用户给了我一个答案。 引用: 来自 QPainter 类的描述:

    警告:当paintdevice是一个小部件时,QPainter只能在一个内部使用 paintEvent() 函数或在由paintEvent() 调用的函数中。 您可以通过调用 update() 来强制调用 paintEvent(),因此您必须将按钮的 onclicked() 信号连接到您正在绘制的小部件的 update() 插槽。

    对于第二个问题,数据可以是成员变量。 这是一个例子:

    // mywidget.h
    #include <QVector>
    #include <QPoint>
    // other includes and the constructor...
    protected:
        virtual void paintEvent(QPaintEvent *event);
    
    private slots:
        void onButtonClicked();
    
    private:
        QPushButton* mButton;
        QVector<QPoint> mCirclesData;
    

    // mywidget.cpp

    MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
    {
        mButton = new QPushButton(this);
       // customise your button...
        connect(mButton, &QPushButton::clicked, this, &MyWidget::onButtonClicked); 
    }
    
    //...
    void MyWidget::onButtonClicked(){
        int x = qrand() % 200, y = x;
        mCirclesData << QPoint(x,y); 
        update(); // force calling paintEvent
    }
    
    void MyWidget::paintEvent(QPaintEvent *event)
    {
         QPainter painter(this);
         QPen pen(Qt::white, 5);
         painter.setRenderHint(QPainter::HighQualityAntialiasing);
         painter.setPen(pen);     
         painter.drawEllipse(mCirclesData.last().x(), mCirclesData.last().y(), 100, 100);
    }
    ``
    

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多