Qt常用控件(二)
- 1.window frame
- 2.windowTitle
- 3.windowIcon
🌟🌟hello,各位讀者大大們你們好呀🌟🌟
🚀🚀系列專欄:【Qt的學習】
📝📝本篇內容:window frame;windowTitle;windowIcon
????上一篇:Qt練習小程序(無法拒絕的按鈕)
💖💖作者簡介:軒情吖,請多多指教(>> ????? ) ??-
1.window frame
在我們之前的使用geometry的時候,并沒有去關注過窗口的尺寸具體指的是哪一部分,是包含標題欄那一行以及其他三邊框呢還是不包含。
其實這個用專業的叫法是window frame即窗口框架,這是操作系統自帶的內容
因此Qt中也提供了不同的API來供尺寸和大小使用
函數聲明 | 函數功能 |
---|---|
frameGeometry | 返回值是QRect類型,計算時包含 window frame |
geometry | 返回值是QRect類型,計算時不包含window frame |
我們可以寫一份代碼來看看它們的不同之處
我們可以發現再構造函數里面怎么是一模一樣的,而且x和y都是0呢?而到了后面按鈕的槽函數中就正常了
這主要是因為代碼是在構造函數中,我們的Widget還沒有完全創建好,還在構造,還沒有被添加到window frame中,看不到window frame帶來的影響,因此就會出現這種情況。但是一旦出了構造函數,比如我們按鈕在槽函數中打印的內容,它就沒問題了,因為此時我們的窗口已經完全構造好了
我們可以稍微淺淺的看一下帶window frame和不帶的區別,首先是x它們之間差了1是因為我們的左側邊框,而y差了那么多的原因是因為標題欄占的位子大。而它的尺寸也是差不多道理,寬度width是因為左右兩邊的邊框各占1像素所以說是2,而高度height是由于標題欄的原因就會大很多。并且window frame比起單純的窗口會占更大空間,因此在位置上,window frame會比單純的窗口坐標位置更小,而在尺寸上會更大。
2.windowTitle
這個屬性肯定非常熟悉了,就是窗口標題,但是有個注意事項,就是這個屬性來自于QWidget,
設置的時候如果是頂層 widget (獨?窗?), 這個操作才會有效,其余的子widget,這個操作則沒有任何效果。
簡單來說就是只有窗口widget可以來設置屬性,其余的像按鈕啊這些控件,雖然都是多多少少繼承于QWidget,但都是子控件,所以它們設置時,不會有任何效果。見下面代碼演示
從理論上來講,不應該給按鈕這樣的功能來設置標題,雖然設置后沒有任何的報錯和效果,但是這樣的設定其實是不太合理的。
3.windowIcon
接下來要將的是windowIcon,這個其實指的是程序的圖標,如下展示,它分別在任務欄或程序界面上顯示
我們默認的圖標就如上圖一樣,沒有任何的觀賞性,也沒有任何的含義
因此Qt也給我們提供了這方面的API
函數聲明 | 函數功能 |
---|---|
QIcon windowIcon() const | 獲取到控件的窗?圖標,返回 QIcon 對象 |
void setWindowIcon(const QIcon &icon) | 設置控件的窗?圖標 |
同樣的,對于windowIcon而言,
僅僅是對頂層widget有效
接下來代碼演示
先在想要的路徑下保存一張圖片,記住它的位置和名字
代碼非常簡單,功能也實現了,但是有幾個問題
首先肯定是有同學會疑惑,為什么這里不使用堆上開辟呢,而是直接使用棧幀上的呢?
在我們之前之所以使用動態開辟是因為我們要保證我們的控件有足夠的生命周期并且加入對象樹中在合適的時候釋放內存,但是QIcon本身是一個比較小的對象,創建后并且已經設置進Widget窗口內部,因此無論釋放不釋放,都不會影響最后的顯示
。并且QIcon不支持對象樹,無法將它掛到父對象下。
接下來要講的是路徑,首先就是不能帶中文,其次我們在演示中使用的是正斜杠\,但是如果想要使用反斜杠\就要注意了,它在C/C++中代表的是轉義字符,因此使用時需要使用雙反斜杠
但是這樣寫還是會有問題,那就是這個路徑是絕對路徑,作為開發者,你無法做不到保證用戶的路徑也是這樣,萬一用戶是只有一個C盤呢?還有一個情況,那就是萬一用戶不小心把這張圖片給刪了怎么辦呢?
因此我們使用相對路徑會比絕對路徑更好,相對路徑是以給定的路徑為基準,以.和…開頭。但是這種方法依舊解決不了用戶把圖片搞丟的情況,因此Qt中還提供了qrc機制
這個機制可以解決兩個問題:
防止用戶把圖片給不小心搞丟
確保用戶的機器上有圖標的路徑
因此要使用這個機制就需要在項目中創建一個新的xml文件(.qrc后綴),在xml文件中,將圖片的數據導入進來,并且在xml中記錄下來,Qt在編譯項目的時候,就會根據qrc中描述的圖片信息,找出圖片內容,再提取出圖片的二進制數據,把這些二進制數據轉成C++代碼,最后一起編譯到exe可執行文件中。但是qrc對于很大的文件無法導入,比如幾個G的視頻文件
接下來講一下怎么創建qrc文件
文件名可以不帶后綴,系統會自動添加為.qrc
創建完文件后,我們就是上圖這樣的一個界面,接下來就是需要先創建一個虛擬目錄,所謂的虛擬目錄就是在電腦上不存在的,是Qt抽象出來的,這主要是為了方便Qt去訪問圖標
接下來就可以使用Add Files來添加圖標了,找到我們的圖片
我們添加的文件就是在之前的prefix前綴路徑下的,但是發現報錯了,說是路徑有問題。
這其實我們的圖片文件在qt路徑下,但是實際上我們需要保證我們的圖標是在.qrc文件的同一目錄下或者是同一目錄下的子目錄下才可以
因此將圖標移動到當前項目的路徑下即可
當界面是這樣就說明成功了,這個時候我們就可以使用剛剛的前綴+文件名來設置圖標了
當代碼中需要訪問qrc管理的文件時就需要在路徑前面加上:
接下來我們就又可以去Qt自動生成的代碼中瞧一瞧,有沒有什么變化沒有
在當前文件夾中倒是什么都發現,但是debug文件中似乎多了一個.cpp結尾的qrc文件,這個就是生成的C++文件
打開后可以發現一個char類型的數組,它其實每一個字節都是圖標里每一個字節的數據
總結:qrc機制將圖片的二進制數據轉換成C++代碼,C++代碼中就會有一個很大的char類型數組,其中的每一個字節就是圖標的二進制轉換而來的,當Qt編譯項目的時候,就會將這個.cpp文件一起編譯到.exe文件中,當exe運行時,這個圖標也就被加載到了內存中。通過這種方式即解決了圖標路徑不一致的問題,也保護了圖標的存在性。
🌸🌸Qt常用控件之QWidget(二)大概就講到這里啦,博主后續會繼續更新更多Qt的相關知識,干貨滿滿,如果覺得博主寫的還不錯的話,希望各位小伙伴不要吝嗇手中的三連哦!如有小伙伴需要Qt的安裝包可以私信我,你們的支持是博主堅持創作的動力!💪💪