//滑鼠按下事件
void mainwindow::mousepressevent(qmouseevent *event)
//滑鼠移動事件
dragposition為qpoint變數,儲存滑鼠相對於窗體左上角的位置,它由滑鼠相對於螢幕(黑色邊框)的全域性位置globalpos()減去窗體(紅色邊框)相對於螢幕的左上角位置topleft()(framegeometry()可以理解為指代窗體這個物件)。1是窗體左上角相對於螢幕的位置,3是滑鼠相對於螢幕的位置,3的位置減去1的位置就得到3相對於1的位置,也就是滑鼠相對於窗體左上角的位置。這個點的座標值為(dx,dy),也就是3距離1的寬度(dx),3距離1的高度(dy)。
現在要將窗體從紅色位置移動到藍色位置(只分析乙個方向的移動好理解,其他方向移動是一樣的),滑鼠按住3這個位置向右移動,移動到4這個位置,移動後滑鼠相對於窗體的位置沒有改變,滑鼠只是相對於螢幕的位置發生了改變。也就是圖中3相對於1的位置與4相對於2的位置是一樣的,即dx和dy的值沒有改變。
move(int x, int y)函式中的x和y值指的是移動後窗體的左上角位置,也就是說move函式中要傳入要移動位置的x,y值。這個值是左上角的x、y值。也就是說我們要得到2位置的x、y值,根據上述分析,只需將4位置的x、y值分別減去dx、dy就得到2位置的x、y值,也就是此時滑鼠的全域性位置globalpos()減滑鼠相對於窗體左上角的位置dragposition(dragposition的位置值就是dx和dy)。(move函式說明:move函式有兩個,乙個是move(int x, int y),乙個是move(const qpoint &p),前者是後者的過載函式,使用哪個都可以,只是傳入的引數不同,第乙個傳入兩個int型別的值x和y,第二個傳入乙個qpoint物件,qpoint物件是螢幕上的乙個點物件,它具有x和y兩個引數。在系統呼叫中,是move(int x, int y)呼叫move(const qpoint &p)的,呼叫方式為
move(int x, int y)
所以真正執行的的函式是move(const qpoint &p),**中也是用這個函式,這裡為了說明清楚,我用move(int x, int y),其實它們的作用是一樣的。)
last變數儲存滑鼠相對於螢幕的全域性位置,在圖中是3這個位置。將窗體從紅色位置移動到藍色位置,也就是1號位置移動到2號位置,3號位置移動到4號位置,它們的移動距離是一樣的。移動距離dx等於滑鼠的全域性x值減去last的x值(這裡沒有分析y,因為是水平移動的只有x軸發生變化),也就是4號位置的x座標減3號位置的x座標就是移動距離。
2號位置座標的x座標就為x()函式的值加上dx值(x()函式為窗體距離螢幕左側的長度,y()函式為窗體距離螢幕頂端的長度),而dx值已由event->globalx() - last.x()獲得。
Qt拖動滑鼠移動窗體中的內容
在qt的窗體中,當顯示的內容比窗體大時,一般會自動出現水平和垂直的滾動條,拖動滾動條就可以使窗體中的內容移動了。但是有時候按照需求當窗體內容比窗體大時,不可以顯示滾動條,要用滑鼠拖動窗體來移動窗體中的內容。首先關閉水平和垂直方向上的滾動條 sethorizontalscrollbarpolicy q...
Qt的滑鼠事件
qt裡常用的滑鼠事件有mousepressevent mousemoveevent mousereleaseevent mousedoubleclickevent滑鼠事件方法。void mousepressevent qmouseevent e void mousemoveevent qmousee...
Qt 通過滑鼠拖拽,來移動無邊框窗體
設定視窗標誌為無邊框 setwindowflags qt framelesswindowhint windowflags 關於windowflags列舉值很多,其中有乙個windowstaysontophint,可以讓窗體位於所有介面之上,類似於qq主面板,一開啟就在所有軟體之上 比較霸道。設定無邊...