QT自定义MainWindow
1.開發環境:Qt 4.7.3 + MinGW 32bit (MSVC2015 32bit)
2.實現大綱:
????????? 1)自定義邊框,標題欄,工具欄,內容欄,狀態欄(后面三個代碼中沒有實現實現)
????????? 2)重寫鼠標事件來控制可以自由移動框體
????????? 3)樣式文件使用qss實現,UI設計/數據/控制分離,方便二次開發
3.具體實現:
??????? 1)通常情況下,linux或者window系統下的QMainwindow的邊框樣式比較原始不太美觀,Qt提供了可以舍棄原有的邊框,然后自定義。具體設置參數如下:
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint); //配置邊框屬性,無邊框 setAttribute(Qt::WA_TranslucentBackground); //設置背景半透明???????? 2)關于框體中框線的樣式設計,可以采用添加QFrame組件,通過設計QFrame的border相關屬性來設置邊框線,但是在設計的過程中發現,如果直接添加在mainwindow中添加QFrame組件,然后再設置border屬性,發現border屬性無效。解決方案可以在QMainwindow和QFrame之間添加一個QWidget作為“畫布”,來顯示QFrame的邊框樣式。
??????? 3)一般來說,window的標題欄一般包括圖標,標題大綱,隱藏/放大/還原/關閉等組件,因此可以添加一個QFrame + QHBoxLayout來配合實現,另外按鈕推薦使用QToolButton(使用QPushButton也可以,但是需要設置setAutoDefault為false,否則會在設計Dialog彈框事埋下隱藏的bug,即關于enter按鍵的響應問題),并且設置其hover屬性和tooltip(懸放時提示按鈕功能)等屬性。
?????? 4)接下來需要重新定義鼠標的事件來實現鼠標拖拽mainwindow功能,主要是關于系統的四個函數的復寫,通過坐標的決定坐標globalPos()和相對坐標pos()直接的變換來記錄移動的距離,從而實現窗體的移動,具體如下:
void mouseReleaseEvent(QMouseEvent *event); //鼠標左鍵釋放 void mouseMoveEvent(QMouseEvent *event); //鼠標左鍵一直按著,系統提供了event->buttons()來專門判斷是否按著 void mousePressEvent(QMouseEvent *event); //鼠標左鍵按下, 且按下的坐標在標題欄上 void mouseDoubleClickEvent(QMouseEvent *event); //雙擊事件也就是完成標題欄上的放大按鈕的相關功能?
4.具體代碼見下載地址:https://download.csdn.net/my/uploads
5.實現截圖:
?
總結
以上是生活随笔為你收集整理的QT自定义MainWindow的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育研究基地观光车是全程的那
- 下一篇: QTextEdit实现图片和文本同行显示