本節小豆君就來講述我們最重要的窗口類QWidget,QWidget是所有GUI控件的基類,所以掌握QWidget的用法是學習Qt的重中之重。
在進入正題之前,小豆君先講一下我自己閱讀Qt類的方法,現在就拿QWidget這個類來講解。
2.2.1 閱讀QWidget方法
在幫助文檔中搜索QWidget,打開QWidget幫助文檔。
- 閱讀詳細描述(Detailed Description):這部分內容告訴了我們QWidget是做什麼的,QWidget都有哪些屬性和方法,我們應如何使用這個類以及和這個類相關的其它類。
- 閱讀類屬性(Properties):一個事物之所以被抽象為某個類,是因為它擁有特定的屬性,或者說它擁有什麼樣的屬性就決定了它是什麼,從而它就具有了什麼樣的功能,所以在看一個類時就需要看它的根本,而根本就是屬性,同時,看屬性的數據類型也是幫助理解屬性的好方法。
- 鼠標點擊某個屬性,查看屬性對應的接口,也許有的屬性不太理解,但是通過介紹和對應接口會幫助理解。
2.2.2 QWidget屬性
新建窗口項目WidgetProperty,類名同為WidgetProperty,選擇基類QWidget。
2.2.2.1 QWidget的幾何屬性
- frameGeometry,frameSize,x,y,pos:框架的幾何區域和大小,框架指窗口的最外層。
- geometry,width,height,size,rect:內部繪圖區域的幾何框架。
在WidgetProperty的構造函數中添加代碼:
<code>WidgetProperty::WidgetProperty(QWidget *parent
) : QWidget(parent
), ui(new
Ui::WidgetProperty) { ui->setupUi(this); setGeometry(0
,0
,400
,300
); }/<code>
運行代碼,窗口的繪圖區域左上角和屏幕的左上角剛好吻合,而標題欄都跑到了屏幕外面。
2.2.2.2 窗口標識
windowFlags屬性。
我們還可以通過調用setWindowFlags(Qt::WindowFlags)來設置窗口類型和窗口標識。
在WidgetProperty構造函數後面繼續添加代碼
<code>move
(100
,100
);setWindowFlags
(Qt
::CustomizeWindowHint |Qt
::WindowStaysOnTopHint);/<code>
運行程序,我們看到窗口的標題欄已經被隱藏掉了,並且當你點擊其他外部窗口時,本窗口仍然在最屏幕最上面。
在WidgetProperty中的構造函數中,你可以調用此函數,通過傳入不同的值來查看在不同窗口標識下窗口是如何表現的,這些值都可以在幫助文檔中找到。
如果想省點事,可以在Qt的示例程序中查找關鍵字“window flags example”,編譯並運行程序,看每個窗口標識的作用。
下面我總結了在實際項目中可能經常用到的標識
常用窗口類型:
Qt::Widget 默認窗口
Qt::Dialog 對話框
Qt::SplashScreen 啟動窗口
常用窗口標識:
Qt::SplashScreen 在還沒有展示出主界面前的啟動畫面
Qt::FramelessWindowHint 隱藏標題欄,並且去掉窗口的邊框,窗口不能移動和縮放。
Qt::CustomizeWindowHint 隱藏標題欄,不會去掉窗口的邊框,窗口不能移動,但可以縮放。
Qt::WindowStaysOnTopHint 使窗口始終處於最頂部。類似於播放器中的總在最前功能。
2.2.2.3 其他屬性
- acceptDrops:接受放下事件。
- autoFillBackground:如果將這個屬性設置為true,Qt將在調用paintEvent之前填充背景。可以使用調色板來進行填充。
- enabled:窗口是否可用,如果被設置為false,則不會接收用戶操作,同時其子控件也不接收用戶操作。
- focus:是否獲得焦點。
- modal:是否為模態窗口,關於模態窗口,我會在QDialog中講解。
- mouseTracking:是否跟蹤鼠標,默認為不跟蹤。默認情況時,當鼠標按下後才會跟蹤鼠標移動,如果被設置為true,在鼠標不按下時,也跟蹤鼠標移動。
- palette:調色板。
- toolTip:鼠標懸停時的提示信息。
- toolTipDuration:鼠標懸停時顯示提示信息持續時間。
- visible:是否可見。
- windowOpacity:窗口透明度0-1。
- windowTitle:窗口標題。
2.2.3 函數調用舉例
下面我們來看個例子,構造函數中換成如下代碼
<code>WidgetProperty::WidgetProperty(QWidget *parent
) : QWidget(parent
), ui(new
Ui::WidgetProperty) { ui->setupUi(this); setAutoFillBackground(true
); QPalette pa = this->palette(); pa.setBrush(QPalette::Background, QBrush(Qt::green)); setPalette(pa); setWindowOpacity(0.9
); setWindowTitle("窗口屬性"
); setToolTip("懸停"
); resize(600
,400
); move(0
,0
); }/<code>
運行程序
好了,今天就到這裡,我們下期再見。