Qt系列文章之 mousePressEvent

2021-02-14 不如起而行之

點擊藍字 關注我們

上一篇文章介紹QTabWidget的使用技巧。本文開始介紹Qt最常用的事件之一QMouseEvent。

滑鼠事件是Qt中十分重要的人機互動形式。滑鼠事件包括很多內容,此處先介紹最基本的mousePressEvent事件函數。如前期文章所示,Qt中的大部分事件函數都已經提供了函數接口,我們只需要在具體項目類中對這些事件函數進行具體實現即可。

打開Qt的widget幫助文檔,可以找到mousePressEvent的函數定義如下所示:

mousePressEvent是一個虛函數,通過在子類之中對其進行實現來關聯具體的滑鼠動作。第一步需要在mainWindow中定義一個mousePressEvent(QMouseEvent *event),注意虛函數的形參類型不能修改,只能是QMouseEvent *,函數定義時後面加上override表示對虛函數進行重新實現。

Cpp之中對mousePressEvent進行實現。

void mainWindow::mousePressEvent(QMouseEvent *event){    return QMainWindow::mousePressEvent(event); }

在事件之中添加一個簡單的列印輸出,event事件對象,此處輸出滑鼠在界面的位置pos(),pos函數給出的是窗口坐標系下的位置而不是桌面坐標下的位置,此函數是比較重要的滑鼠事件函數,用於定位滑鼠位置:

qDebug()<<"mouse clicked "<<event->pos();

編譯運行代碼,在界面隨便點擊滑鼠,不論是點擊左中右鍵都會輸出一條信息:

如果我們只希望捕獲滑鼠左鍵點擊事件,那麼在事件處理函數中使用如下的代碼過濾掉其他滑鼠鍵輸入。button()函數輸出滑鼠點擊的鍵值。此時再點擊滑鼠右鍵或者中鍵不會有反應。

if(event->button()==Qt::LeftButton){   qDebug()<<"mouse clicked "<<event->pos();}

下面給滑鼠動作加一些複雜的動作,我們先在ui的tab_2添加一個居中的tableWidget,命名為mouseControlTable:

此時table是一個空的表格,我們先給表格添加兩列:

下面通過數表動作來動態為表格修改行數,假設點擊滑鼠左鍵我們為表格增加一行,點擊滑鼠右鍵為表格刪除一行。

void mainWindow::mousePressEvent(QMouseEvent *event){    int tableRowCount = ui->mouseControlTable->rowCount();    if(event->button()==Qt::LeftButton)    {        ui->mouseControlTable->insertRow(tableRowCount);    }    if(event->button()==Qt::RightButton)    {        if(tableRowCount) ui->mouseControlTable->setRowCount(tableRowCount-1);    }    return QMainWindow::mousePressEvent(event); }

此時在界面上如果點擊左鍵,表格會動態增加一行,如果點擊右鍵,表格會動態減少一行。不過有心的您會發現,當您點擊表格區域時,什麼動作都不會發生。那是因為QTableWidget本身就有自己的mouseEvent虛函數,我們並沒有對其進行定義。為了實現在表格上點擊滑鼠操作(如複製粘貼等動作),我們需要對表格類QTableWidget進行繼承開發新類,並書寫mouseEvent方法,然後將ui中拉入QTableWidget控制項提升為自己開發的新類型。這些將在下一篇帖子進行介紹。

鄭重承諾:本公眾號所有文章都是以技術交流為目的,均為原創,不主動向閱讀者收取任何費用,不以任何手段盈利。希望讀者們能夠多多反饋您的寶貴意見和問題,以幫助我們優化後期文章,共同進步,感謝您的閱讀~

相關焦點

  • 【Python研發】Qt入門之開發一個無邊框界面
    和mouseMoveEvent。def mousePressEvent(self, event):    if event.button() == Qt.LeftButton:        self.drag_position = event.globalPos() - self.frameGeometry().topLeft()        event.accept()
  • QT 技術應用常用問題解答
    ){if (maybeSave()){writeSettings();event->accept();}else{event->ignore();}}2、如何用打開和保存文件對話答:使用QFileDialog
  • JavaScript-event對象常用的屬性和方法有哪些?
    1.document.querySelector("#d1").onclick = function(e){console.log(e);};2.document.querySelector("#d1").onmousemove = function(eve
  • Qt官方示例-文本省略
    void setText(const QString &text);    const QString & text() const { return content; }    bool isElided() const { return elided; }protected:    void paintEvent(QPaintEvent *event
  • 模擬滑鼠點擊,自動閱讀超星文章,掛時長神器!
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)        win32api.SetCursorPos((0,0))        win32api.SetCursorPos((1430, 265))        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN
  • Press center allows for greater access
    issued by the press center,which opened on Wednesday.Registered reporters from home and abroad started arriving at the press center on Wednesday to pick up their press cards for the all-important,once-in-five-year political event that is expected
  • JS事件對象Event詳解
    每篇文章純屬個人經驗觀點,如有錯誤疏漏歡迎指正一、什麼是事件對象 Event  每一個事件觸發時
  • Razor-qt:一個輕巧快捷的桌面環境
    不過你很幸運,因為Razor-qt——一個輕巧、簡單的Qt桌面環境——來了。Razor-qt 並非一個完整的、可以和KDE或GNOME相提並論的桌面環境;最重要的是,它假設已經有了一個窗口管理器,需要與之合作方可完成任務。
  • notice no.29 premier li keqiang will meet the press
    Journalist attending the event shall present both the NPC press cards and the invitation.Please note that one invitation is good for one person and is only valid for entry when used together with the NPC press card.
  • QT學習之如何讀寫配置文件(QSettings)
    文章目錄概述平臺一.配置文件長什麼樣子?二.如何讀寫配置文件1.頭文件包含2. 配置文件不存在就創建3. 讀配置文件4. 寫配置文件3.測試結果平臺一.配置文件長什麼樣子?QVariant &defaultValue = QVariant())void setValue(const QString &key, const QVariant &value)以下代碼可創建出如上述圖片所寫配置文件: QSettings *settings = new QSettings("/home/cai/qt_pro
  • C++學習教程,QT飛機大戰教程(含詳細步驟教程一)
    第一個場景為主場景 MainScene不帶UI界面2.1 打開Qt找到你安裝的Qt Creator,打開它如果安裝時,沒有選擇在桌面上建立快捷方式,那麼你的Qt軟體位置如下C:\qtGAME_RATE);5.5 啟動定時器實現地圖滾動在MainScene.h中添加新的成員函數以及成員對象//啟動遊戲 用於啟動定時器對象voidplayGame();//更新坐標voidupdatePosition();//繪圖事件voidpaintEvent(QPaintEvent*event
  • Qt信號槽原理
    其實,直到寫這篇文章,我也沒有完全看明白相關的源碼,只是明白了其中的大部分以及使用機制,其中還有很多細節的,留待以後整理。如果錯誤還請大家指正。(),原數據對象類型轉換,轉換成指定的類型,使用時一般傳入父類的名稱字符串;方法qt_metacall(),執行函數的回調,信號觸發;方法qt_static_metacall(),回調函數,被qt_metacall()調用,內部執行槽;這裡的幾個方法都沒有實現體,因為實現部分會有 moc 工具生成,在moc_xxx.cpp 文件中可以查看這些方法的實現體
  • qt排序算法可視化
    考慮到 view 的寬度和 高度是會變的,然而只有在進行過一次paintevent後才能知道他的高度和寬度,所以一開始我們用一個trick 來獲取 view的高度和寬度。用item重寫QWidget的原因是需要用他的paintevent來實現一些特定的功能例如我想把顏色和一些數據表徵在上面protected:    void paintEvent(QPaintEvent *event);為了表示一個比較好的視覺體驗,我專門去找了 rgb漸變的算法,並自己用c++實現了一下。
  • jQuery快速入門基礎教程之事件(二)
    問題:我怎麼才能收到你們公眾號平臺的推送文章呢?
  • Qt 國際化(下)
    我們要在 main()函數中添加幾句:int main(int argc, char *argv[]){ QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("myapp.qm"); a.installTranslator
  • 英語閱讀系列之 A Town Mouse and A Country Mouse
    今天我們的英語閱讀系列是這樣一篇文章,關於一隻城裡的老鼠和鄉下的老鼠的故事。大家快來快來閱讀吧!A Town Mouse and a Country Mouse were friends.我的儲藏室是一個有規律的富饒之角。你一定要來和我呆在一起,我保證你會住在這塊肥沃的土地上。」所以當他回到城裡時,他帶著鄉下老鼠帶他到一個裝有麵粉和燕麥片、無花果、蜂蜜和棗子的儲藏室裡。鄉下老鼠從來沒有見過這樣的東西,坐下來享受朋友提供的奢侈品。但是在他們開始之前,儲藏室的門打開了,有人進來了。
  • 騰訊abcmouse怎麼樣?過來人親身經歷說說
    其中的成人和兒童角色均為標準美語發音,通過幽默有趣、互動學習的語境向兒童解讀和教授英語單詞和短語,避免了傳統英語教學中用中文直譯的方法。abc mouse目前有有超過百萬美國家庭與5萬的多名教師的用戶並獲得多項由教育協會、家長組織與傳媒團體頒發的大獎。美國兒童迄今已經在ABCmouse網站與移動應用上完成超過10億次線上學習活動。