更新不调用paintEvent吗?

时间:2019-06-06 15:49:40

标签: c++ qt qt5

`我检索了鼠标光标的位置,我想通过paintevent画一条线,但是没有被update调用,所以什么也没发生

.cpp


void MainWindow::mousePressEvent(QMouseEvent * event)
   {
       if(event->button() == Qt::LeftButton)
       {
           if(mFirstClick)
           {
               mStartX = event->x();
               mStartY = event->y();
               mFirstClick = false;
           }
           else if(!mFirstClick)
           {
               mEndX = event->x();
               mEndY = event->y();
               mFirstClick = true;

               mPaintFlag = true;
               update();
           }


       }
       ui->label_7->setText(QString::number(mStartX)+ ", "+QString::number(mStartY) +"//"+QString::number(mEndX)+ ", "+QString::number(mEndY));


   }

void MainWindow::paintEvent(QPaintEvent * event)
    {
       QMainWindow::paintEvent(event);


        if(mPaintFlag=true)
        {

            QPainter painter(this);
            QPen paintpen(Qt::red);
            paintpen.setWidth(4);

            QPen linepen(Qt::red);
            linepen.setWidth(4);

            QPoint p1;
            p1.setX(mStartX);
            p1.setY(mStartY);

            painter.setPen(paintpen);
            painter.drawPoint(p1);

            QPoint p2;
            p2.setX(mEndX);
            p2.setY(mEndY);

            painter.setPen(paintpen);
            painter.drawPoint(p2);

            painter.setPen(linepen);
            painter.drawLine(p1, p2);

        }

}

.h


protected:

    void mousePressEvent(QMouseEvent * e);
    virtual  void paintEvent(QPaintEvent * e) override;

我没有重涂油漆而不是更新,但是什么也没显示,我该如何调用paintevent画线

1 个答案:

答案 0 :(得分:4)

不确定什么OP做错了。至少,OP没有公开MCVE

出于好奇,我自己做了一个– . . . render(){ return ( <div class="calendly-inline-widget" data-url="https://calendly.com/username" style={{"min-width":"320px","height":"780px"}} /> ); }

testQMainWindowPaint.cc

使用#include <QtWidgets> class MainWindow: public QMainWindow { private: QPoint start, end; bool firstClick; public: MainWindow(); virtual ~MainWindow() = default; MainWindow(const MainWindow&) = delete; MainWindow& operator=(const MainWindow&) = delete; protected: virtual void mousePressEvent(QMouseEvent *pQEvent) override; virtual void paintEvent(QPaintEvent *pQEvent) override; }; MainWindow::MainWindow(): QMainWindow(), start(0, 0), end(0, 0), firstClick(true) { } void MainWindow::mousePressEvent(QMouseEvent *pQEvent) { if (pQEvent->button() == Qt::LeftButton) { (firstClick ? start : end) = pQEvent->pos(); firstClick = !firstClick; update(); pQEvent->accept(); } } void MainWindow::paintEvent(QPaintEvent *pQEvent) { QMainWindow::paintEvent(pQEvent); if (!firstClick) return; QPainter painter(this); QPen pen(Qt::red); pen.setWidth(4); painter.setPen(pen); painter.drawLine(start, end); } int main(int argc, char **argv) { qDebug() << "Qt Version:" << QT_VERSION_STR; QApplication app(argc, argv); // init GUI MainWindow winMain; winMain.show(); // runtime loop return app.exec(); } 进行编译:

testQMainWindowPaint.pro

在Windows 10的cygwin64中进行了编译:

SOURCES = testQMainWindowPaint.cc

QT += widgets

单击两次后,制作了以下快照:

Snapshot of testQMainWindowPaint

因此,我得出一个结论:OP的错误一定是在未公开的代码中。尽管我不完全复制OP的代码,但没有看到任何可能阻止渲染该红线的关键部分。

相关问题