1. 程式人生 > 其它 >Qt中mouseMoveEvent(QmouseEvent *event)使用探討

Qt中mouseMoveEvent(QmouseEvent *event)使用探討

技術標籤:qtc++ui設計

Qt中mouseMoveEvent(QmouseEvent *event)使用探討

在學習網路教程過程中,嘗試使用Qpainter製作一個塗鴉板,需要使用QmouseEvent ,按照教程,塗鴉板不能繪製曲線,只能繪製直線。這裡做一些總結。
教程連結:http://shouce.jb51.net/qt-beginning/21.html

在這裡插入圖片描述
依據連結的教程所述,mouseMoveEvent實現如上,除錯是後面加的,程式碼中判斷語句沒有執行進來在這裡插入圖片描述
ui中關於mouseTracking的設定如上(本例中不需要勾選)
問題確認:
1)ui設計介面勾選mouseTracking或者程式碼設定setMouseTracking(true);後,不需要按下滑鼠左鍵,移動滑鼠即可捕捉滑鼠移動事件

2)ui設計介面沒有勾選mouseTracking或者程式碼設定setMouseTracking(false);後(預設不做處理即為該情況),需要按下滑鼠左鍵移動滑鼠才可捕捉滑鼠移動事件
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(); }