掌握PyQt5的高級窗口控件,讓你的GUI應用具備專業級的布局與交互體驗
在PyQt5應用開發中,高效管理窗口布局和實現復雜交互功能是提升用戶體驗的關鍵。本文將深入解析三個核心高級控件:停靠窗口(QDockWidget)、多文檔界面(MDI)和滾動條(QScrollBar),通過代碼示例帶你快速掌握它們的實戰應用。
QDockWidget:靈活可停靠的窗口控件
QDockWidget是PyQt5中用于創建可停靠子窗口的核心控件,它可以在主窗口內自由浮動或停靠在指定區域,為專業級應用提供靈活的布局方案。
方法 | 描述 |
---|---|
setWidget() | 在Dock囗區域設置QWidget |
setFloating() | 設置Dock窗口是否可以浮動,如果設置為True,則表示可以浮動 |
setAllowedAreas() | 設置窗口可以停靠的區域:LeftDockWidgetArea,左邊停靠區域;RightDockWidgetArea,右邊停靠區域;TopDockWidgetArea,頂品停靠區域;BottomDockWidgetArea,部停靠區域;NoDockWidgetArea,不顯示Widget; |
setFeatures() | 設置停靠窗口的功能屬性:DockWidgetClosable,可關閉;DockWidgetMovable,可移動;DockWidgetFloatabIe,可漂浮;DockWidgetVcrticaITitIeBar,在左邊顯示垂直的標簽欄;AllDockWidgetFeatures,具有前三種屬性的所有功能;NoDockWidgetFeatures,無法關團,不能移動,不能漂浮; |
QDockWidget的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class DockDemo(QMainWindow):def __init__(self,parent=None):super(DockDemo,self).__init__(parent)layout=QHBoxLayout()bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("save")file.addAction("quit")self.items=QDockWidget("Dockable",self)self.listWidget=QListWidget()self.listWidget.addItem("item1")self.listWidget.addItem("item2")self.listWidget.addItem("item3")self.items.setWidget(self.listWidget)self.items.setFloating(False)self.setCentralWidget(QTextEdit())self.addDockWidget(Qt.RightDockWidgetArea,self.items)self.setLayout(layout)self.setWindowTitle("Dock 例子")if __name__ == '__main__':app=QApplication(sys.argv)demo=DockDemo()demo.show()sys.exit(app.exec_())
運行結果
MDI多文檔界面:高效管理多個子窗口
MDI(Multiple Document Interface)允許在單個主窗口容器內管理多個文檔窗口,相比獨立的SDI窗口,它能顯著節省系統資源并提供更集成的用戶體驗。
QMdiArea核心方法
一個典型的GUI應用程序可能有多個窗口,選項卡控件和堆棧窗口控件允許一
次使用其中的一個窗口。然而,很多時候這種方法不是很有用,因為其他窗口的視
圖是隱藏的。
一種同時顯示多個窗口的方法是,創建多個獨立的窗口,這些獨立的窗口被稱
為SDI(SingleDocumentlnterface,單文檔界面),每個窗口都可以有自己的菜單系
統、工具欄等。這需要占用較多的內存資源。
MDI(Multiple Document lnterface,多文檔界面)應用程序占用較少的內存資
源,子窗口都可以放在主窗口容器中,這個容器控件被稱為QMdiArea。
QMidArea控件通常占據在QMainWindow對象的中央位置,了窗口在這個區域
是QMdiSubWindow類的實例,可以設置任何QWidget作為子窗口對象的內部控件,
子窗口在MDI區域進行級聯排列布局。
QMdiArea類和QMdiSubWindow類中的常用方法如表5-16所示。
方法 | 描述 |
---|---|
addSubWindow() | 將一個小控件添加在MDI區域作為一個新的子窗囗 |
removeSubWindow() | 刪除一個子窗囗中的小控件 |
setActiveSubWindow() | 激活一個子窗口 |
caseadeSubWindows() | 安排子窗口在MDI區域級聯顯示 |
tileSubWindows() | 安排子窗口在MDI區域平鋪顯示 |
closeActiveSubWindow() | 關閉活動的子窗口 |
subWindowList() | 返回MDI區域的子窗口列表 |
setWidget() | 設置一個小控件作為QMdiSubwindow實例對象的內部件 |
多重文檔界面
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class MainWindow(QMainWindow):count=0def __init__(self,parent=None):super(MainWindow,self).__init__(parent)self.mdi=QMdiArea()self.setCentralWidget(self.mdi)bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("cascade")file.addAction("Tiled")file.triggered[QAction].connect(self.windowaction)self.setWindowTitle("MDI demo")def windowaction(self,q):print("triggered")if q.text()=="New":MainWindow.count=MainWindow.count+1sub=QMdiSubWindow()sub.setWidget(QTextEdit())sub.setWindowTitle("subwindow"+str(MainWindow.count))self.mdi.addSubWindow(sub)sub.show()if q.text()=="cascade":self.mdi.cascadeSubWindows()if q.text()=="Tiled":self.mdi.tileSubWindows()if __name__ == '__main__':app=QApplication(sys.argv)demo=MainWindow()demo.show()sys.exit(app.exec_())
運行結果
QScrollBar:實現精確的滾動控制
QScrollBar不僅提供基本的滾動功能,還能作為交互式控件用于數值調整,特別適合需要精確控制的場景(如顏色選擇器)。
核心信號說明
方法 | 描述 |
---|---|
valueChanged | 當滑動條的值改變時發射此信號 |
sliderMoved | 當用戶拖動滑塊時發射此信號 |
QScrollBar
?
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
?
class Example(QWidget):def __init__(self):super(Example,self).__init__()self.initUI()
?def initUI(self):hbox=QHBoxLayout()self.l1=QLabel("拖動滑動條去改變顏色")self.l1.setFont(QFont("Arial",16))hbox.addWidget(self.l1)self.s1=QScrollBar()self.s1.setMaximum(255)self.s1.sliderMoved.connect(self.sliderval)self.s2=QScrollBar()self.s2.setMaximum(255)self.s2.sliderMoved.connect(self.sliderval)self.s3=QScrollBar()self.s3.setMaximum(255)self.s3.sliderMoved.connect(self.sliderval)hbox.addWidget(self.s1)hbox.addWidget(self.s2)self.setGeometry(300,300,300,200)self.setWindowTitle("QScrollBar 例子")self.setLayout(hbox)
?def sliderval(self):print(self.s1.value(),self.s2.value(),self.s3.value())palette=QPalette()c=QColor(self.s1.value(),self.s2.value(),self.s2.value(),255)palette.setColor(QPalette.Foreground,c)self.l1.setPalette(palette)
?
if __name__ == '__main__':app=QApplication(sys.argv)demo=Example()demo.show()sys.exit(app.exec_())
運行效果
?
代碼分析:
在這個例了中,設置了三個滑動條來控制標簽中所顯示文字的字體顏色的RGB
值。
當移動滑塊時,將sliderMoved信號與槽函數sliderval()連接起來。
總結:高級控件的應用場景
PyQt5中的高級窗口控件為開發專業級GUI應用提供了強大支持:
-
QDockWidget - 適用于需要靈活布局的開發環境(如IDE、圖形設計軟件)
-
MDI界面 - 適合多文檔處理應用(如文本編輯器、電子表格、CAD軟件)
-
QScrollBar - 不僅實現滾動功能,還可用于創建自定義控制面板(如調色板、參數調節器)
掌握這些控件的高級用法,能夠顯著提升應用的用戶體驗和專業感。建議在實際項目中根據具體需求組合使用這些控件,構建出既美觀又高效的GUI界面。