天天看點

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

目錄

1、菜單欄

1.1、Qt Creator建立菜單欄

1.2、 菜單欄類建立菜單欄

2、工具欄

2.1、Qt Creator建立工具欄

2.2、 工具欄類建立工具欄

3、狀态欄

在使用Qt Creator建立UI檔案時,MainWindow主視窗,主要包含:菜單欄、工具欄、狀态欄等。

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
輕按兩下菜單欄上的“在這裡輸入”,輸入文字,最後按Enter鍵即可生成菜單。
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
例如,建立:檔案、編輯兩個一級菜單欄目,如下所示:
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
可以在一級目錄下建二級目錄,在檔案欄目下建立打開欄目,如下所示:
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
在Qt Designer的屬性編輯器中可以對動作進行編輯,設定快捷鍵、圖示等資訊,其詳細資訊如下圖所示:
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

最後生成的UI檔案可以再進行信号和槽的功能代碼編寫。

在QMainWindow對象的标題欄下方,水準的QMenuBar被保留顯示QMenu對象。QMenu類提供了一個可以添加到菜單欄的小控件,也用于建立上下文菜單和彈出菜單。每個QMenu對象都可以包含一個或多個QAction對象或級聯的QMenu對象。

PyQt API提供了createPopupMenu()函數建立一個彈出菜單;menuBar()函數用于傳回主視窗的QMenuBar對象; addMenu()函數可以将菜單添加到菜單欄中;通過addAction()函數可以在菜單中進行添加操作等。在設計菜單系統時使用的一些重要方法如下表所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
通個示例了解QMenuBar、QMenu和QAction菜單欄類,示例效果如下所示:
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

示例中,頂層視窗必須是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_())      

QToolBar控件是由文本按鈕、圖示或其他小控件按鈕組成的可移動面闆,通常位于菜單欄下方。

使用Qt Designer預設生成的主視窗中不顯示工具欄,可以通過單擊滑鼠右鍵來添加工具欄,如下圖所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

此時的工具欄是空的,沒有元件,如下所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

可以在Qt Designer的屬性編輯器中建立addWinAction動作,并拖入添加到工具欄中,其詳細資訊如下圖所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)
Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

同菜單欄一樣,最後生成的UI檔案可以再進行信号和槽的功能代碼編寫。

QToolBar類中的常用方法如下表所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

每當單擊工具欄中的按鈕時,都将發射actionTriggered信号。另外,這個信号将關聯的QAction對象的引用發送到連接配接的槽函數上。

通個示例了解QToolBar工具欄類,示例效果如下所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

示例中,首先調用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_())      

MainWindow對象在底部保留有一個水準條,作為狀态欄(QStatusBar),用于顯示永久的或臨時的狀态資訊。

QStatusBar類中的常用方法如下表所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

通個示例了解QStatusBar狀态欄類,示例效果如下所示:

Python Qt GUI設計:菜單欄、工具欄和狀态欄的使用方法(拓展篇—2)

在這個例子中,頂層視窗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_())