VS QT滑鼠事件的一些補充

2021-10-04 03:05:40 字數 3666 閱讀 4005

(1) 按下press -> void mousedoubleclickevent ( qmouseevent * event )

(2) 抬起release -> void mousemoveevent ( qmouseevent * event )

(3) 移動move -> void mousepressevent ( qmouseevent * event )

(4) 雙擊double click -> void mousereleaseevent ( qmouseevent * event )

重寫這四個函式,就能夠讓自定義控制項支援滑鼠操作。

event->pos()  當前的滑鼠座標

x, y : 座標

globalx, globaly: 全域性座標(相對於整個螢幕)

button: 滑鼠左鍵、右鍵、中鍵

class ...

;當事件發生時,

emit iamclicked ( pos );

通過emit操作將訊號發射出去了。

例:.**件中

signals:

void selected(int axis); //發射行列分析座標訊號

.cpp檔案中

void showp::mousepressevent(qmouseevent * event)        //按下

訊號與槽.

// ui.frameshowp這個乙個qwidget視窗

connect(ui.frameshowp, signal(selected(int)),this, slot(onselected(int)));

響應函式.(函式要在.**件中private slots:先宣告)

int mytest::onselected(int axis)  //

在qt中要捕捉滑鼠移動事件需要重寫mousemoveevent,但是mousemoveevent為了不太耗資源在預設狀態下是要滑鼠按下才能捕捉到移動。

如果要想滑鼠不按下時的移動也能捕捉到,需要setmousetracking(true)(啟用整個窗體的滑鼠追蹤)。

bool mousetracking; 這個屬性儲存的是視窗部件跟蹤滑鼠是否生效。

*如果滑鼠跟蹤失效(預設),當滑鼠被移動的時候只有在至少乙個滑鼠按鍵被按下時,這個視窗部件才會接收滑鼠移動事件。

*如果滑鼠跟蹤生效,如果沒有按鍵被按下,這個視窗部件也會接收滑鼠移動事件。

qwidget: 在qwidget視窗中這樣使用是沒有問題的。

qmainwindow: 即使使用了setmousetracking(true),在qmainwindow依然無法捕捉到滑鼠沒有按下的移動,只有在滑鼠按下才能捕捉到移動。

qmainwindow中解決辦法:要先把qmainwindow的centrolwidget使用setmousetracking(true)開啟移動監視。然後在把qmainwindow的setmousetracking(true)開啟監視。之後就一切正常了。

原因:centrolwidget是qmainwindow的子類,你如果在子類上響應滑鼠事件,只會觸發子類的mousemoveevent,根據c++繼承和過載的原理,所以子類也要setmousetracking(true); 所以如果你想響應滑鼠事件的控制項被某個父控制項包含,則該控制項及其父控制項或容器也需setmousetracking(true);

.**件中

新增對於標頭檔案*);

在widget.h中宣告右鍵事件處理函式void contextmenuevent(qcontextmenuevent

宣告右鍵選單訊號

按下選單響應函式宣告

#include #include #include private:

void contextmenuevent(qcontextmenuevent *);//右鍵選單支援

private:

qaction* act_maxsize;

qaction* act_normal;

private slots:

void addchange();

void xmlchange()

.cpp檔案中

1.新建選單動作訊號

2. 建訊號與槽(.**件中先宣告響應函式)

3. 右鍵選單函式

4. 按下選單響應函式

act_maxsize = new qaction(tr("xml"), this);  //新建訊號

act_normal = new qaction(tr("show"), this);

connect(act_maxsize, signal(triggered()), this, slot(addchange())); //訊號與槽

connect(act_normal, signal(triggered()), this, slot(xmlchange()));

void widget::contextmenuevent(qcontextmenuevent *) //右鍵選單項編輯

void widget::addchange()

void widget::xmlchange()

參考:

當操作滑鼠按鍵會發現,滑鼠按下、抬起、雙擊訊號對於滑鼠的左鍵和右鍵都能觸發,怎麼才能更好的區分動作的是左鍵還是右鍵。

qt::mousebutton qmouseevent::button() const

返回引發事件的按鈕。

注意,對於滑鼠移動事件,返回的值總是qt::nobutton。

代表按鍵型別的列舉變數 enum qt::mousebutton

qt::nobutton 0x00000000----------------移動或者未按下 返回 nobutton

qt::allbuttons 0x07ffffff--------------------左右鍵全按下 返回 allbuttons

qt::leftbutton 0x00000001 ------------- 左鍵全按下 返回 leftbutton

qt::rightbutton 0x00000002 ----------- 右鍵全按下 返回 rightbutton

故可以通過以下方法判斷左鍵操作還是右鍵操作:

void mywidget::mousepressevent(qmouseevent * event) //按下

if (ev->button() & qt::rightbutton) //右鍵按下 }

void mywidget::mousereleaseevent(qmouseevent * event) //釋放

if (ev->buttons() & qt::rightbutton) //右鍵釋放 }

void mywidget::mousedoubleclickevent(qmouseevent * event) //雙擊

if (ev->buttons() & qt::rightbutton) //右鍵雙擊

}

linux一些指令的補充

chgrp 改變群組 chgrp命令變更檔案或目錄所屬群組,比如 檢視現在aa檔案所屬組為clip root clip clip ls l aa total 32040 rwxrwxr x 1 clip clip 1260 apr 26 14 05 aa 想更改為delijia 這個地方改變的群組必...

Cookie補充的一些知識

cookie的有效期 cookie的maxage決定著cookie的有效期,單位為 second cookie中通過getmaxage 與setmaxage int maxage 讀寫maxage屬性。cookie cookie new cookie username helloweenvsfei ...

一些css樣式的補充

1.display none,不生成盒子 2.visbility hidden,生成盒子,只是從視覺上移除盒子,任然佔據空間 1.當屬於網頁內容時,必須使用img元素 2.當僅用於美化網頁時,必須使用背景圖 background image url repate y y軸重複 repate x x軸...