Qt隱藏系統標題欄,使用自定義標題欄

花狗Fdog_發表於2020-09-23

在這裡插入圖片描述


文章目錄


一.前言

       今天我們來實現自定義標題欄的實現,這裡面用到了佈局,滑鼠事件重寫等知識點,首先還是自定義標題欄的創作,像下面這樣,可放大,可縮小,並且隨著窗體大小的改變,控制元件做自適應調整。有沒有感覺狗子的介面做的越來越好看,哈哈,其實只是想告訴大家,孰能生巧,第一次可能很醜,慢慢來嘛,我第一次也被人噴過。廢話不多說,看實現。
在這裡插入圖片描述


二.實現

在這裡插入圖片描述
       首先還是先把介面搭建出來,如上圖,我知道有很多不會搭建這個佈局,確實,我剛學習的時候,書中關於佈局也是草草略過,我之前寫過一個佈局的介紹,大家可以看一下,qt 如何設計好佈局和漂亮的介面,當然,你看了其中有關佈局的知識,相信我,你依舊還是不能隨心所欲的布成自己想要的局。你去百度,關於佈局的知識,其實和我上面寫的一樣,其實這裡面還隱藏一些配合,只不過可能這個知識點對於會佈局的人來說太簡單了,他們會選擇性略過。
比如下面幾個我能想到的問題:

  • 對頂級視窗進行佈局,佈局和窗體有一定距離;

解決方法:選中頂級窗體,屬性裡面找到佈局,將紅括號內的值改為0,佈局和窗體的距離就為0.
在這裡插入圖片描述

  • 拖了一個佈局,並且將相關控制元件加入佈局,但是一旦將頂級視窗新增布局,控制元件大小就會不可控;

解決方法:之所以如此,是因為我們沒有指定控制元件最大值和最小值,這也是為什麼大家看到的軟體,有一些控制元件最大化後跟隨介面變大,而一些控制元件是不變化的,就比如最小化,最大化控制元件等等。大家只需要選中控制元件,右鍵選中選中大小限定,就會得到我們想要的大小。
在這裡插入圖片描述

  • 介面放大或者縮小後,控制元件位置問題;

解決方法:要運用彈簧(horizontalSpacer)這個功能,並靈活運用sizetype這個屬性,例如Minimum(最小大小),Maximum(最大大小),Expanding(自適應)等等,比如我們選擇了Maximum,介面放大時,我們就不用這個彈簧放大。
在這裡插入圖片描述

然後佈局就寫到這裡,涉及的有關控制元件背景圖可加我qq2506897252獲取,無償的。


       下面說一下功能的實現,有細心讀者可能發現上面的動態圖有兩個標題欄,這不是騙人嘛,我想說不是騙人,到最後白色的標題欄我們是要隱藏的,為了文章的前後順序,我們暫時先把他留下。

       先將最小化,最大化以及關閉按鈕的功能進行實現,這裡可以選擇程式碼實現,也可以在ui介面實現,只不過ui介面實現有一些侷限性,由於我們目的是使用自定義標題欄,所以這裡直接在ui介面進行實現。
在這裡插入圖片描述
       進行訊號和槽繫結後,我們現在就可以使用自定義的標題欄來實現最小化,最大化,關閉,接下來就是將系統的標籤欄進行隱藏,如果在這之前,就將系統的標題欄隱藏,那麼對於編譯後生成的軟體關閉將是不方便的。
在主窗體的建構函式加入this->setWindowFlags(Qt::FramelessWindowHint);,編譯執行即可隱藏系統標籤欄。
在這裡插入圖片描述
       隱藏後,會發現無法我們無法移動視窗了,想要移動視窗,我們需要進行滑鼠事件重寫,包括mousePressEvent(QMouseEvent *event)mouseMoveEvent(QMouseEvent *event)mouseReleaseEvent(QMouseEvent *event)

首先在mainwindow.h中宣告這三個函式:

    void mousePressEvent(QMouseEvent *event);//滑鼠點選
    void mouseMoveEvent(QMouseEvent *event);//滑鼠移動
    void mouseReleaseEvent(QMouseEvent *event);//滑鼠釋放
//新增類成員m_point(QPoint型別)
QPoint m_point;

mianwindow.cpp中進行定義:


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_point = event->globalPos()-frameGeometry().topLeft();
        //滑鼠位置減去左上角的左邊
        //可替換為m_point = event->pos();
    }
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    move(event->globalPos() - m_point);
    //滑鼠位置減去按下點的座標
    //可替換為event->pos() - m_point + pos();
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    //Q_UNUSED() 沒有實質性的作用,用來避免編譯器警告
}

對應的m_point = event->globalPos()-frameGeometry().topLeft();可替換為m_point = event->pos();

別忘了加入標頭檔案#include<QMouseEvent> #include<QPoint>

完成上述程式碼,編譯執行,視窗可通過滑鼠移動。


相關文章