首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新不调用paintEvent?

更新不调用paintEvent?
EN

Stack Overflow用户
提问于 2019-06-06 15:49:40
回答 1查看 582关注 0票数 1

‘我检索了鼠标光标的位置,我想用喷漆画一条线,但是没有被更新调用,所以什么都没有发生

.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
protected:

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

我做了重新绘制,而不是更新,但什么都没有显示,我怎样才能打电话给油漆绘制线。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 16:20:34

不知道什么行动做错了。至少OP没有公开一个MCVE

出于好奇,我自己做了一个- testQMainWindowPaint.cc

代码语言:javascript
复制
#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编译

代码语言:javascript
复制
SOURCES = testQMainWindowPaint.cc

QT += widgets

在Windows 10上用cygwin64编译:

代码语言:javascript
复制
$ qmake-qt5 testQMainWindowPaint.pro

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQMainWindowPaint.o testQMainWindowPaint.cc
g++  -o testQMainWindowPaint.exe testQMainWindowPaint.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQMainWindowPaint 
Qt Version: 5.9.4

单击两次后,我创建了以下快照:

因此,我得出结论: OP的错误必须在未公开的代码中。虽然,我没有完全复制OP的代码,但我没有看到任何可能阻止呈现红线的关键部分。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档