Qt自定義視窗事件

2021-06-25 10:00:51 字數 2819 閱讀 2341

一、移動主介面

移動主介面是通過按住滑鼠左鍵進行標題欄拖動最終導致主介面移動;由於還有視窗伸縮功能,因此對於標題欄左部,頂部,右部應該騰出5畫素空間給視窗伸縮功能使用,即滑鼠移動到這5畫素空間之內的話,滑鼠形狀就會發生改變(暗示可以伸縮視窗);為什麼只有標題欄騰出5畫素空間,而其他部件(如工具欄、內容區域、狀態列)就不需要了?因為只有標題欄部件重新實現了void mousepressevent(qmouseevent *event); void mousemoveevent(qmouseevent *event); void mousereleaseevent(qmouseevent *event);這三個事件;而主視窗也實現了它自己的這三個事件,為了防止介面移動和介面伸縮相衝突,所以留有5畫素的空間為視窗伸縮功能使用;下面講解移動主介面的**實現:

總體思路是:滑鼠按下時設定按下標識並儲存按下點座標;滑鼠移動時,判斷是否按下(標識)然後獲得移動滑鼠點的座標,根據兩者的差值最後移動主介面即可;當然,滑鼠釋放時肯定要重置按下標識。 

[html]view plain

copy

//滑鼠按下事件  

void titlebar::mousepressevent(qmouseevent *event)  

m_ptpress

= event

->

globalpos();  

m_bleftbuttonpress

= true

;  }  

event->

ignore();  

}  //滑鼠移動事件  

void titlebar::mousemoveevent(qmouseevent *event)  

event->

ignore();  

}  //滑鼠釋放事件  

void titlebar::mousereleaseevent(qmouseevent *event)  

event->

ignore();  

}  

注意,在事件的末尾要加上event->ignore();語句,因為標題欄是覆蓋在主介面部件之上的,所以事件傳遞是先傳遞給標題欄,標題欄完成該事件之後,應使用event->ignore();表示繼續將事件傳遞給其父物件(即主介面部件);

二、伸縮主介面

介面當然要可以伸縮,即視窗變大變小,這些也是由滑鼠事件產生的,也是三個事件處理**;當滑鼠移動到主介面內部周圍5畫素時,改變滑鼠形狀;當進行伸縮拖動時,根據拖動方向進行主介面的位置和大小設定即可。

[html]view plain

copy

view code   

//滑鼠按下事件  

void mainwindow::mousepressevent(qmouseevent *event)  

}  //滑鼠移動事件  

void mainwindow::mousemoveevent(qmouseevent *event)  

else  

}  //滑鼠釋放事件  

void mainwindow::mousereleaseevent(qmouseevent *event)  

}  //滑鼠雙擊事件  

void mainwindow::mousedoubleclickevent(qmouseevent *event)  

else  

m_bmaxwin

= !m_bmaxwin;  

}  }  

其中設定滑鼠形狀的**如下:

[html]view plain

copy

view code   

//設定滑鼠樣式  

void mainwindow::setcursorstyle(enum_direction direction)  

}  [html]view plain

copy

view code   

//設定滑鼠拖動的視窗位置資訊  

void mainwindow::setdraymove(int nxglobal,int nyglobal,enum_direction direction)  

if(direction & eright)  

if(direction & ebottom)  

if(direction & eleft)  

if(rectwindow.width()<

minimumwidth

() || rectwindow.height()

<

minimumheight

())  

//重新設定視窗位置為新位置資訊  

setgeometry(rectwindow);  

}  

三、雙擊最大化和還原

這個功能處理起來很簡單,只要重新實現void mousedoubleclickevent(qmouseevent *event)事件即可並且限制有效範圍,即在不超過標題欄高度的畫素空間範圍內雙擊才有效:

[html]view plain

copy

view code   

//滑鼠雙擊事件  

void mainwindow::mousedoubleclickevent(qmouseevent *event)  

else  

m_bmaxwin

= !m_bmaxwin;  

}  }  

Qt 自定義事件

最近做的專案,是用qt的完成的,在用到事件派發的時候,要用自己自定義的事件型別來滿足需要。具體就是按照qt的官方文件說明,做了乙個簡單的例子,以免忘記,就先寫下來儲存。首先有個customevent 類,繼承自qevent ifndef customevent h define customeven...

Qt 自定義事件

關於qt的自定義事件也是看了幾個大牛的部落格。總結下心得,如有錯誤請指出。一起成長。先給原始碼。也是第一次原創啊,不知道怎麼寫,呵呵。include include class mywidget public qwidget static const int mycustomeventtype 10...

Qt 自定義事件

qt 自定義事件很簡單,同其它類庫的使用很相似,都是要繼承乙個類進行擴充套件。在 qt 中,你需要繼承的類是 qevent。繼承qevent類,你需要提供乙個qevent type型別的引數,作為自定義事件的型別值。這裡的qevent type型別是qevent裡面定義的乙個enum,因此,你是可以...