一、引言
Qt Designer中的部件欄並沒有菜單、toolBar以及Action相關的部件,僅在MainWindow類型窗口提供了menu、toolBar相關的功能,Action可以在右側的Action Editor中編輯,如圖:
如果沒有出現Action Editor,可以通過鼠標右鍵的彈出菜單將其打開,如圖:
二、Action
2.1、功能
Action是Qt中單獨引入的一個對象,對應QAction類。Action表示一個獨立的操作,是將界面上某個可以通過菜單、快捷鍵、toolBar按鈕執行的同一個操作映射到同一個Action對象,由該對象通過信號觸發實際的操作。
2.2、Action的屬性
Action對象在Qt Designer中可以設置快捷鍵、圖標、toolTip、是否可選擇等屬性,可以通過triggered()信號連接槽函數。如圖:
2.3、Action創建的方法
在Qt Designer中,可以兩種方法創建Action對象,一種是菜單定義時,一種是單獨定義。
2.3.1、定義菜單創建Action
在Qt Designer中創建菜單時,如果對應菜單是最終執行的菜單項,則添加菜單項時自動創建了對應的Action對象,炳輝自動建立二者的關聯。如圖:
上圖錄入了一個“member manage”的菜單,但還未最終提交,可以看到右下角的Action Editor中並沒有對應的Action對象。錄入完成后情況如下:
2.3.2、直接創建Action
在Qt Designer的Action Editor中可以直接創建新的Action對象,如圖:
點擊上面藍色圈標記的圖標就可以Action屬性編輯界面,如圖:
可以在屬性編輯中設置相關的屬性。
2.4、Action關聯menu菜單
通過菜單創建的Action,已經與菜單自動關聯,如果是單獨創建的Action,需要與菜單掛接時,直接將Action Editor中定義好的Action對象拖拽到菜單欄上即可以新建一個與Action對應的單獨菜單項,從而實現Action與菜單的關聯。
2.5、Action關聯toolBar工具欄
創建的Action對象,如果需要在toolBar中呈現,需要將Action與toolBar掛接時,直接將Action Editor中定義好的Action對象拖拽到toolBar上即可。
2.6、Action通過代碼關聯toolBar、menu
一個已經存在的Action對象,除了上面介紹的在Qt Designer中實現與toolBar、menu關聯的方法外,還可以直接通過代碼實現關聯。關聯方法為:
toolBar對象.addAction(action對象)
menu對象.addAction(action對象)
實際上通過Qt Designer在界面上的關聯也是通過addAction方法實現的,界面生成的代碼如下例所示:
self.menusystem.addAction(self.actionQuit)
self.menusystem.addAction(self.actionAbout)
self.menusystem.addAction(self.actionFind)
self.toolBar.addAction(self.actionQuit)
self.toolBar.addAction(self.actionAbout)
self.toolBar.addAction(self.actionFind)
Action對象通過menu、toolBar調用addAction方法掛接到菜單和toolBar上,掛接后在菜單上就是一個新增的獨立菜單項,在toolBar上就是新增的一個toolBar按鈕。
2.7、Action的信號
Action與菜單和工具欄掛接后,只是實現了相關的關聯關系,但並不能執行響應操作,真正的響應操作是通過Action的信號與對應槽函數連接實現的。
Action提供了4種信號:
- changed()信號:當修改Action的屬性時觸發,如修改Action的toolTip信息
- hovered()信號:當Action關聯的菜單項或toolBar在鼠標停留在其上,或者按下了Action的快捷鍵時觸發
- toggled(bool checked)信號:當Action設置了checkable屬性時,關聯的菜單項或toolBar在點擊后會改變選中狀態,此時觸發toggled信號,參數為是否選中的最新狀態
- triggered(bool checked = false)信號:當Action關聯的菜單項或toolBar在鼠標點擊或快捷鍵按下時觸發,也可以通過調用action對象的trigger方法觸發。
以上四個Action的信號,一般情況下執行菜單、工具欄按鈕以及快捷菜單的響應操作時,使用triggered(bool checked = false)信號連接槽函數來執行。
2.8、Action的信號連接槽函數的方法
Action的信號連接槽函數不能通過Designer的edit菜單的信號編輯進行編輯,不能在界面上通過連接線方式設定信號和槽的連接,只能在Designer右邊的信號與槽編輯器中直接編輯,如圖:
點擊上圖中藍色圈標記的加號,新加一條信號槽函數記錄,如圖:
雙擊記錄中每個字段對每個字段進行編輯,編輯后的結果如下圖案例:
注意信號一般選擇triggered,slot選擇一個系統具有的或通過信號和槽編輯已經增加的槽函數都可以。
三、菜單
菜單由menu bar菜單欄和menu菜單兩部分構成,分別對應類QMenuBar和QMenu。
menuBar是包含一系列下拉菜單項組成,menu包含兩種,一種是直接對應Action的,一種是父菜單,下面的子菜單對應Action,在此稱對應了Action的菜單為菜單項(這個稱呼可能與菜單項的標准說法不一致)。
3.1、菜單欄及菜單的界面定義操作
在Qt Designer中,如果主窗口無菜單通過在主窗口中鼠標右鍵的彈出菜單可以給主窗口創建菜單欄,如圖:
如果已經創建菜單欄,通過鼠標右鍵點擊菜單條的彈出菜單可以刪除菜單,如圖:
菜單欄創建后,就可以通過直接鼠標點擊菜單欄后通過鍵盤輸入菜單名回車后創建菜單,並用同樣的方法創建子菜單。
菜單的創建還有一種方法就是直接拖拽Action到菜單中,就會直接生成菜單項。
3.2、菜單QMenu的信號
菜單除了通過Action的信號連接槽函數外,也可以通過菜單自身的信號連接槽函數,只是菜單自身的信號不是基於菜單項的,而是基於菜單項的父菜單QMenu類的。有如下信號:
- aboutToHide()信號:當菜單隱藏前觸發
- aboutToShow()信號:當菜單展示前觸發
- hovered(QAction *action)信號:鼠標停留在菜單項上面時觸發
- triggered(QAction *action)信號:當菜單項對應的Action被觸發時觸發。
以上4個信號經老猿驗證,在Qt Designer中設計好信號和槽函數連接后,通過PyUIC生成的代碼並沒有建立連接的代碼。只有自己在派生類的構造方法中增加建立信號和槽函數連接的代碼才可以。以下是老猿在派生類的構造方法添加的QMenu信號和槽函數連接的代碼案例:
self.menusystem.triggered['QAction*'].connect(self.menuSystemTrigger)
self.menusystem.aboutToHide.connect(self.menuHide)
self.menusystem.aboutToShow.connect(self.menuShow)
QtCore.QMetaObject.connectSlotsByName(self)
3.3、菜單欄QMenuBar的信號
QMenuBar菜單欄主要有2個信號:
- hovered((QAction *action)信號:當鼠標懸停在任何一個菜單欄下的菜單項關聯的Action對應的菜單項或工具欄按鈕時觸發,觸發時先觸發各Action的hovered()信號,再觸發QMenuBar的hovered()信號
- triggered(QAction *action)信號:菜單下面的任何一個菜單項(即Action)被觸發時觸發,請參考Action的triggered()信號。
以上兩個信號在Action和menu中都存在,使用菜單欄的信號來觸發這種情況,一般是在開發者不想將槽函數對應到每個菜單項而是對應到父菜單時使用,但這樣在槽函數中就需要判斷具體是哪個菜單項被觸發。
以上二個信號可以在Qt Designer中直接進行槽函數連接並使用PyUIC生成代碼。
四、toolBar工具欄
前面已經介紹toolBar工具欄上的按鈕是通過拖動Action到toolBar上創建的,這樣通過點擊按鈕就能與操作菜單一樣的效果。
4.1、toolBar的界面定義操作
在Qt Designer中,如果主窗口無toolBar通過在主窗口中鼠標右鍵的彈出菜單可以給主窗口創建toolBar工具欄,如圖:
已經創建的toolBar可以通過在toolBar上點擊鼠標右鍵移除,如圖:
4.2、toolBar的屬性
4.2.1、movable屬性
4.2.1.1、概述
movable屬性用來確認toolBar是否可以移動,如果設置為可移動,則toolBar可以在主窗口范圍內拖拽移動。
4.2.1.2、訪問方法
通過isMovable()、setMovable(bool movable)來讀取或設置該屬性。
4.2.1.3、相關信號
movableChanged(bool movable)信號:movableChanged信號在工具欄變成可移動或不能移動時觸發,如果工具欄可移動,則movable為True,否則為False。
注意:這個信號是在調用setMovable改變工具欄的是否允許移動時觸發,不是移動工具欄觸發。
4.2.1.4、注意
- 設置movable屬性為True的工具欄,在工具欄前有個可移動標記,如圖:
上圖中藍色標記的部分就是可移動標記,移動時鼠標點擊該標記進行拖拽移動,當movable屬性為False時無此標記。
- 可移動的toolBar在移動時會縮小到合適的大小,在進入toolBar的allowedAreas范圍內時將自動顯示toolBar區域范圍,並在鼠標釋放后自動在該范圍內拉伸。
4.2.2、allowedAreas屬性
4.2.2.1、allowedAreas屬性功能
allowedAreas屬性指定工具欄允許移動的范圍,其類型為枚舉類Qt.ToolBarAreas,有如下取值:
以上取值可以同or操作組合使用。
4.2.2.2、訪問方法
缺省值為Qt.AllToolBarAreas,可以通過allowedAreas()、setAllowedAreas(Qt.ToolBarAreas areas)來訪問或設置該屬性。
4.2.2.3、allowedAreas 相關信號
allowedAreasChanged( allowedAreas):當toolBar允許的區域設置發生變更時觸發該信號,參數allowedAreas為新的可允許的區域。
4.2.2.4、注意
在floatable屬性為True的情況下:
- 只要工具欄設置成可移動的,則無論allowedAreas設置何值都可以移動,但只有在進入toolBar的allowedAreas范圍內時將才會自動顯示toolBar區域范圍,並在鼠標釋放后自動在該范圍內拉伸附着,否則將保持最適合的大小浮動在窗口之上
- toolBar初始位置不受allowedAreas影響,allowedAreas僅在移動時才有效。如果初始位置不是allowedAreas指定范圍之內,則未移動前工具欄保持在初始位置,但一旦移動就受allowedAreas限制,此種情況下不能再回到初始位置。
在floatable屬性為False的情況下:
- 只要工具欄設置成可移動的,則無論allowedAreas設置何值都可以移動,但只有在進入toolBar的allowedAreas范圍內時將才會自動顯示toolBar區域范圍,並在鼠標釋放后自動在該范圍內拉伸附着,否則將回到其初始位置
- toolBar初始位置不受allowedAreas影響,allowedAreas僅在移動時才有效。如果初始位置不是allowedAreas指定范圍之內,則未移動前工具欄保持在初始位置,一旦移動就受allowedAreas限制,如果當前位置不是allowedAreas指定區域,此時釋放鼠標按鈕將回到初始位置。
4.2.3、orientation屬性
orientation屬性用於確認工具欄是水平方向還是垂直方向,這個屬性對於QMainWindow中的工具欄來說沒有意義,因為QMainWindow中的工具欄支持在上下左右四個方向擺放。
orientation屬性缺省是水平方向(Qt.Horizontal,值為0x1),可以使用orientation()、setOrientation(Qt.Orientation orientation)來訪問,垂直方向的為Qt.Vertical,值為0x2。
當toolBar的orientation設置改變時,會觸發orientationChanged(Qt.Orientation orientation)信號。
4.2.4、iconSize屬性
iconSize屬性表示工具欄中圖標的大小。默認大小由應用程序的樣式決定,並從QStyle.PM_ToolBarIconSize 定義的像素大小繼承。這是一個圖標可以擁有的最大尺寸,比這更小的圖標將不會放大。
可以使用iconSize()、setIconSize(QSize iconSize)來訪問此屬性。
iconSizeChanged(QSize &iconSize) 是改變此屬性的值是工具欄發出的信號。
4.2.5、toolButtonStyle屬性
tooButtonStyle屬性保存主工具欄按鈕的樣式設置,用來表示工具欄按鈕的文字和圖標怎么顯示。
該屬性的可設置值類型為枚舉類型Qt.ToolButtonStyle,它包含如下值:
該屬性的缺省值為Qt.ToolButtonIconOnly,可以使用toolButtonStyle() 來訪問工具欄該屬性的設置,使用setToolButtonStyle(Qt.ToolButtonStyle )來設置此屬性。
toolButtonStyleChanged(Qt.ToolButtonStyle toolButtonStyle)是變更此屬性時工具欄發出的信號。
注意:
此屬性與主窗口的toolButtonStyle屬性同名且設置值及含義完全一樣。在主窗口設置了toolButtonStyle屬性的情況下,新加工具欄的toolButtonStyle屬性默認就是主窗口的toolButtonStyle屬性,但當工具欄的toolButtonStyle屬性改變之后,主窗口的工具欄的toolButtonStyle屬性就不對工具欄的工具欄的toolButtonStyle屬性產生作用。因此,主窗口的toolButtonStyle屬性值是主窗口內新建工具欄默認的toolButtonStyle屬性值。
4.2.6、floatable屬性
floatable屬性用於保存工具欄是否可以作為獨立小窗口拖放,其類型為bool類型,默認值為True,表示工具欄可以漂作為獨立窗口拖放。
下圖是漂浮在窗口上的工具欄案例:
可以通過isFloatable()()、setFloatable(bool)來訪問和設置該屬性。
五、小結
本節詳細介紹了主窗口對象相關的菜單、toolBar相關的屬性和信號,並介紹了與二者緊密關聯的Action的功能、操作設置方法,有了這些東西就能完成一個主窗口應用的基本框架功能了。