1. 程式人生 > 實用技巧 >qt自定義標題欄-qwidget應用實現雙擊、拖拽等功能

qt自定義標題欄-qwidget應用實現雙擊、拖拽等功能

背景描述:

在qt下做了一個介面,原標題欄應用時,無法新增左上角圖示,因此自定義了一個標題欄,新增一個qwidget代替。

解決問題:

為了省事,沒有新建title類,直接在mainwindow添加了qwidget,所以處理滑鼠事件時,需要對滑鼠位置進行額外的判斷處理,只有當前滑鼠事件的位置在widget_title的範圍內,才進行事件的處理。

介面描述:

標題欄:widget_title

選單欄:widget_menu (在widget_title下方)

程式碼實現:

重寫mouseDoubleClickEvent、mousePressEvent、mouseMoveEvent三個事件處理函式

標頭檔案裡:

1 // 雙擊標題欄
2 virtual void mouseDoubleClickEvent(QMouseEvent *event);
3 // 點選標題欄
4 virtual void mousePressEvent(QMouseEvent *event);
5 // 拖動標題欄
6 virtual void mouseMoveEvent(QMouseEvent *event);

cpp裡實現

 1 void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
 2 {
 3 
 4     int l_titleY = mapToGlobal(ui->widget_title->pos()).y();
5 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 6 int l_mouseY = event->globalPos().y(); 7 // 判斷滑鼠位置 8 if(l_mouseY > l_titleY && l_mouseY < l_menuY) 9 { 10 if(m_bIsMaxWindow)//判斷當前視窗狀態,自己新增實現即可,簡單 11 { 12 showNormal(); 13
} 14 else 15 { 16 showMaximized(); 17 } 18 } 19 } 20 21 void MainWindow::mousePressEvent(QMouseEvent *event) 22 { 23 int l_titleY = mapToGlobal(ui->widget_title->pos()).y(); 24 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 25 int l_mouseY = event->globalPos().y(); 26 if (event->button() == Qt::LeftButton && l_mouseY > l_titleY && l_mouseY < l_menuY) //點選左邊滑鼠 27 { 28 m_dragPosition = event->globalPos() - frameGeometry().topLeft(); 29 //globalPos()獲取根視窗的相對路徑,frameGeometry().topLeft()獲取主視窗左上角的位置 30 event->accept(); //滑鼠事件被系統接收 31 } 32 33 } 34 35 void MainWindow::mouseMoveEvent(QMouseEvent *event) 36 { 37 int l_titleY = mapToGlobal(ui->widget_title->pos()).y(); 38 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 39 int l_mouseY = event->globalPos().y(); 40 if (event->buttons() == Qt::LeftButton && l_mouseY > l_titleY && l_mouseY < l_menuY) //當滿足滑鼠左鍵被點選時。 41 { 42 move(event->globalPos() - m_dragPosition);//移動視窗 43 event->accept(); 44 } 45 }