1. 程式人生 > >Qt creator 快速入門(一)

Qt creator 快速入門(一)

第8章 介面外觀

調色盤QPalette類包含了部件各種狀態的顏色組。一個調色盤包含3種狀態:
- 啟用顏色組QPalette::Active,用於獲得鍵盤焦點的視窗;
- 非啟用顏色組QPalette::Inactive,用於其他的視窗;
- 失效顏色組QPalette::Disabled,用於一些原因而不可用的部件。

Qt樣式表
Qt樣式表的術語和規則與HTML CSS(Cascading Style Sheets,CSS)層疊樣式表基本相同。
1. 樣式規則
樣式表包含一些列的樣式規則,一個樣式規則由一個選擇符(selector)和宣告(declaration)組成。選擇符指定了受該規則影響的部件,宣告指定了這個部件上要設定的屬性。如:
QPushButton{color:red}


其中QPushButton為選擇符,{color:red}為宣告,color為屬性,red為值。

  1. 選擇符型別
    如:
選擇符 示例 說明
通用選擇符 * 匹配所有部件
型別選擇符 QPushButton 匹配所有QPushButton例項和它的所有子類
屬性選擇符 QpushButton[flat=”false”] 匹配QPushButton的屬性flat為false的例項
…… …… ……

3. 子控制元件
QComboBox::drop-down{image:url(dropdown.png)}

  1. 偽狀態
    如:
QPushButton:hover{color:red}
QPushButton:!hover{color:red}//表示否定
QCheckBox:hover:checked{color:white}//邏輯與的效果
QCheckBox:hover,QCheckBox:checked{color:white}//邏輯或的效果
  1. 衝突解決

    • 特殊的選擇符優先;
    • 有偽狀態的優先;
    • 特殊性相同,則後出現的優先。
  2. 層疊
    部件有效的樣式表是通過部件祖先的樣式表和QApplication上的樣式表合併得到的。當發生衝突時,部件自己的樣式表優先於任何繼承的樣式表。

盒子模型
當使用樣式表時,每一個部件都看作是一個擁有4個同心矩形的盒子,這四個矩形分別是內容(content)、填襯(padding)、邊框(border)和邊距(margin)。邊距、邊框和填襯的寬度預設值都是0。
image繪製在border-image之上,border-image繪製在background-image之上。background-image無法隨著部件的大小來自動縮放,需要使用border-image。

第7章 訊號與槽

使用訊號和槽應該注意的幾點:
- 需要繼承自Qobject或其子類;
- 在類宣告的最開始新增Q_OBJECT巨集;
- 槽中的引數型別要和訊號的引數的型別相對應,且不能比訊號的引數多;
- 訊號只要宣告,沒有定義,且返回值為void型別。

模型:connect(object1,signal,object2,slot);

訊號和槽機制的特色和優越性:
- 訊號和槽機制是型別安全的,相關聯的訊號和槽的引數必須匹配;
- 訊號和槽是鬆耦合的,訊號傳送者不知道也不需要知道接受者的資訊;
- 訊號和槽可以使用任意型別的任意數量的引數。

回撥函式
回撥就是指向函式的指標,把這個回撥函式指標傳遞給要被處理的函式,那麼就可以在這個函式被處理時在適當的地方呼叫這個回撥函式。回撥機制主要有兩個缺陷:
1. 不是型別安全的(type-safe),不能保證在呼叫回撥函式時可以使用正確的引數;
2. 強耦合的,處理函式必須要知道呼叫哪個函式。

元物件系統
Qt中的元物件系統(Meta-Object system)提供了物件建通訊的訊號和槽機制、執行時型別資訊和動態屬性系統。元物件系統是基於以下3個條件的:
- 該類必須繼承自QObject類;
- 必須在類的私有宣告區宣告Q_OBJECT巨集(預設為private);
- 元物件編譯器Meta-Object Compiler(moc),為QObject的子類實現元物件特性提供必要的程式碼。

隱式共享
(Implicit Sharing)又稱寫時複製(copy-on-write)。Qt中主要的隱式共享類有:QByteArray、QCursor、QFont、QPixmap、QString、QUrl、QVariant和所有的容器類等。當隱式共享類使用“=”操作符時就使用淺拷貝,當一個物件被修改時,就必須進行深拷貝。深拷貝意味著複製一個物件,而淺拷貝則是複製一個引用(僅僅是一個指向共享資料塊的指標)。

第6章 事件系統

一個事件由一個特定的QEvent子類來表示,一個事件有可能包含多個事件型別,如滑鼠事件又分為按下、移動、雙擊等事件。在QCoreApplication類的notify()函式的幫助文件處給出了5種處理事件的方法:
- 方法一:重新實現部件的paintEvent()、mousePressEvent()等事件處理函式。
- 方法二:重新實現notify()函式,一次只能處理一個事件。
- 方法三:向QApplication物件上安裝事件過濾器,可以同時處理多個事件。
- 方法四:重新實現event()函式,QObject類的event()函式可以在事件到達預設事件處理函式之前獲得該事件。
- 方法五:在物件上安裝事件過濾器。使用事件過濾器可以在一個介面類中同時處理不同子部件的不同事件

事件傳遞順序例子:部件事件過濾器->子部件的event()函式->子部件的事件處理函式->部件的事件處
理函式。確切地說應該是先傳遞給獲得焦點的視窗部件的。
要對一個部件使用事件過濾器,那麼就先要使用該部件的installEventFilter()函式為該部件安裝事件過濾器。如果對一個特定的事件進行處理,而且不希望它在後面的傳遞過程中再被處理,那麼就返回true,否則返回false。

第4章 佈局管理

一旦一個部件設定了佈局管理器,那麼它會完成一下幾種任務:
- 定位子部件;
- 感知視窗預設大小;
- 感知視窗最小大小;
- 改變大小處理;
- 當內容改變時自動更新:
- 字型大小,文字或子部件的其他內容隨之改變;
- 隱藏或顯示子部件;
- 移除一個子部件;

第5章 應用程式主視窗

QMainWindow類擁有自己的佈局:
- 選單欄(QMenuBar),選單欄包含一個下拉選單項的列表,這些選單項由QAction動作來實現。
- 工具欄(QToolBar),工具欄一般用於顯示一些常用的選單專案,也可以插入其他視窗部件。
- 中心部件(Central Widget)
- Dock部件(QDockWidegt),Dock部件常被稱為停靠視窗。
- 狀態列(QStatusBar)