`我检索了鼠标光标的位置,我想通过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画线
答案 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
单击两次后,制作了以下快照:
因此,我得出一个结论:OP的错误一定是在未公开的代码中。尽管我不完全复制OP的代码,但没有看到任何可能阻止渲染该红线的关键部分。