Qt中mouseMoveEvent(QmouseEvent *event)使用探討
阿新 • • 發佈:2020-12-22
Qt中mouseMoveEvent(QmouseEvent *event)使用探討
在學習網路教程過程中,嘗試使用Qpainter製作一個塗鴉板,需要使用QmouseEvent ,按照教程,塗鴉板不能繪製曲線,只能繪製直線。這裡做一些總結。
教程連結:http://shouce.jb51.net/qt-beginning/21.html
依據連結的教程所述,mouseMoveEvent實現如上,除錯是後面加的,程式碼中判斷語句沒有執行進來
ui中關於mouseTracking的設定如上(本例中不需要勾選)
問題確認:
1)ui設計介面勾選mouseTracking或者程式碼設定setMouseTracking(true);後,不需要按下滑鼠左鍵,移動滑鼠即可捕捉滑鼠移動事件
3)mouseMoveEvent中的evet->button()經除錯確認為Qt::NoButton,即程式碼中的處理不能達到預期的效果,可修改成在mousePressEvent中使用全域性變數記住按下的按鍵,在mouseMoveEvent中使用來判斷,修改後程式碼如下,可以實現塗鴉板作圖,繪製曲線。
void Dialog::paintEvent(QPaintEvent *event)
{
Q_UNUSED (event);
QPainter pp(&pix);
pp.drawLine(lastpoint / scale, endpoint / scale);
lastpoint = endpoint;
QPainter painter(this);
painter.scale(scale, scale);
painter.drawPixmap(0, 0, pix);
}
void Dialog::mousePressEvent(QMouseEvent *event)
{
lastpress_button = event->button ();
if (event->button() == Qt::LeftButton) {
lastpoint = event->pos();
qDebug() << "mousePressEvent pos:" << event->pos() << endl;
}
}
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
qDebug() << "mouseMoveEvent pos:" << event->pos() << endl;
qDebug() << "event->button():" << event->button() << endl;
if (lastpress_button & Qt::LeftButton) {
endpoint = event->pos();
qDebug() << "mouseMoveEvent LeftButtonpress pos:" << event->pos() << endl;
update();
}
}
void Dialog::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
endpoint = event->pos();
qDebug() << "mouseReleaseEvent pos:" << event->pos() << endl;
update();
}
}
void Dialog::wheelEvent(QWheelEvent *event)
{
if (event->delta() > 0) { //滾輪向上滾
scale *= 1.25;
} else if (event->delta() < 0) {
scale /= 1.25;
}
update();
}