在使用Qt Creator創建UI文件時,MainWindow主窗口,主要包含:菜單欄、工具欄、狀態欄等。
1、菜單欄
1.1、Qt Creator創建菜單欄
雙擊菜單欄上的“在這里輸入”,輸入文字,最后按回車鍵即可生成菜單。
例如,建立:文件、編輯兩個一級菜單欄目,如下所示:
可以在一級目錄下建二級目錄,在文件欄目下建立打開欄目,如下所示:
在Qt Designer的屬性編輯器中可以對動作進行編輯,設置快捷鍵、圖標等信息,其詳細信息如下圖所示:
最后生成的UI文件可以再進行信號和槽的功能代碼編寫。
1.2、 菜單欄類創建菜單欄
在QMainWindow對象的標題欄下方,水平的QMenuBar被保留顯示QMenu對象。QMenu類提供了一個可以添加到菜單欄的小控件,也用于創建上下文菜單和彈出菜單。每個QMenu對象都可以包含一個或多個QAction對象或級聯的QMenu對象。
PyQt API提供了createPopupMenu()函數創建一個彈出菜單;menuBar()函數用于返回主窗口的QMenuBar對象; addMenu()函數可以將菜單添加到菜單欄中;通過addAction()函數可以在菜單中進行添加操作等。在設計菜單系統時使用的一些重要方法如下表所示:
通個示例了解QMenuBar、QMenu和QAction菜單欄類,示例效果如下所示:
示例中,頂層窗口必須是QMainWindow對象,才可以引用QMenuBar對象。通過addMenu()方法將“File"菜單添加到菜單欄中。菜單中的操作按鈕可以是字符串或QAction對象。菜單發射triggered信號,將該信號連接到槽函數proecesstrigger(),該函數接收信號的QAction對象。單擊任何QAction按鈕時,QMenu對象都會發射triggered信號。
實現代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MenuDemo(QMainWindow):
def __init__(self, parent=None):
super(MenuDemo, self).__init__(parent)
layout = QHBoxLayout()
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
save = QAction("Save",self)
save.setShortcut("Ctrl+S")
file.addAction(save)
edit = file.addMenu("Edit")
edit.addAction("copy")
edit.addAction("paste")
quit = QAction("Quit",self)
file.addAction(quit)
file.triggered[QAction].connect(self.processtrigger)
self.setLayout(layout)
self.setWindowTitle("menu 例子")
self.resize(350,300)
def processtrigger(self,q):
print( q.text()+" is triggered" )
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MenuDemo()
demo.show()
sys.exit(app.exec_())
2、工具欄
QToolBar控件是由文本按鈕、圖標或其他小控件按鈕組成的可移動面板,通常位于菜單欄下方。
2.1、Qt Creator創建工具欄
使用Qt Designer默認生成的主窗口中不顯示工具欄,可以通過單擊鼠標右鍵來添加工具欄,如下圖所示:
此時的工具欄是空的,沒有組件,如下所示:
可以在Qt Designer的屬性編輯器中新建addWinAction動作,并拖入添加到工具欄中,其詳細信息如下圖所示:
同菜單欄一樣,最后生成的UI文件可以再進行信號和槽的功能代碼編寫。
2.2、 工具欄類創建工具欄
QToolBar類中的常用方法如下表所示:
每當單擊工具欄中的按鈕時,都將發射actionTriggered信號。另外,這個信號將關聯的QAction對象的引用發送到連接的槽函數上。
通個示例了解QToolBar工具欄類,示例效果如下所示:
示例中,首先調用addToolBar()方法在工具欄區域添加文件工具欄。然后,添加具有文本標題的工具按鈕,工具欄通常包含圖形按鈕,具有圖標和名稱的QAction對象將被添加到工具欄中。最后,將actionTriggered信號連接到槽函數toolbtnpressed()。
實現代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class ToolBarDemo( QMainWindow ):
def __init__(self, parent=None):
super(ToolBarDemo, self).__init__(parent)
self.setWindowTitle("toolbar 例子")
self.resize(300, 200)
layout = QVBoxLayout()
tb = self.addToolBar("File")
new = QAction(QIcon("./new.png"),"new",self)
tb.addAction(new)
open = QAction(QIcon("./open.png"),"open",self)
tb.addAction(open)
save = QAction(QIcon("./save.png"),"save",self)
tb.addAction(save)
tb.actionTriggered[QAction].connect(self.toolbtnpressed)
self.setLayout(layout)
def toolbtnpressed(self,a):
print("pressed tool button is",a.text() )
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = ToolBarDemo()
demo.show()
sys.exit(app.exec_())
3、狀態欄
MainWindow對象在底部保留有一個水平條,作為狀態欄(QStatusBar),用于顯示永久的或臨時的狀態信息。
QStatusBar類中的常用方法如下表所示:
通個示例了解QStatusBar狀態欄類,示例效果如下所示:
在這個例子中,頂層窗口MainWindow 有一個菜單欄和一個QTextEdit 對象,作為中心控件。當單擊MenuBar的菜單時,將triggered信號與槽函數processTrigger()進行綁定。當單擊"show"菜單選項時,會在狀態欄顯示提示信息,并在5秒后消失。
實現代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class StatusDemo(QMainWindow):
def __init__(self, parent=None):
super(StatusDemo, self).__init__(parent)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("show")
file.triggered[QAction].connect(self.processTrigger)
self.setCentralWidget(QTextEdit())
self.statusBar= QStatusBar()
self.setWindowTitle("QStatusBar 例子")
self.setStatusBar(self.statusBar)
def processTrigger(self,q):
if (q.text()=="show"):
self.statusBar.showMessage(q.text()+" 菜單選項被點擊了",5000)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = StatusDemo()
demo.show()
sys.exit(app.exec_())