從官網(wǎng)的tutorial學習PyQt5最合適不過站楚,最主要的是跟著走一遍官方教程后妹萨,對于整個PyQt有全方位的理解,這篇文章主要抽取比較典型的一個案例具體展開分析尝盼。
PyQt5 tutorial官網(wǎng)地址
PyQt5 examples源碼Github地址
此文章代碼示例位于 pyqt5_examples/dialogs/configdialog/configdialog.py模蜡,選這個示例漠趁,考慮到涵蓋布局管理、窗口切換忍疾、窗口自動調(diào)節(jié)這些常見的操作闯传,值的拿出來單獨講一下,廢話不多數(shù)卤妒,上圖:
configdialog.py:
from PyQt5.QtCore import QDate, QSize, Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
QListView, QListWidget, QListWidgetItem, QPushButton, QSpinBox,
QStackedWidget, QVBoxLayout, QWidget)
import configdialog_rc
# 定義ConfigurationPage UI
class ConfigurationPage(QWidget):
def __init__(self, parent=None):
super(ConfigurationPage, self).__init__(parent)
configGroup = QGroupBox("Server configuration")
# 定義一個名為Server.的label
serverLabel = QLabel("Server:")
#定義下拉形態(tài)的組合框甥绿,并填充元素
serverCombo = QComboBox()
serverCombo.addItem("Trolltech (Australia)")
serverCombo.addItem("Trolltech (Germany)")
serverCombo.addItem("Trolltech (Norway)")
serverCombo.addItem("Trolltech (People's Republic of China)")
serverCombo.addItem("Trolltech (USA)")
# 橫向布局
serverLayout = QHBoxLayout()
serverLayout.addWidget(serverLabel)
serverLayout.addWidget(serverCombo)
# 縱向布局
configLayout = QVBoxLayout()
configLayout.addLayout(serverLayout)
configGroup.setLayout(configLayout)
mainLayout = QVBoxLayout()
mainLayout.addWidget(configGroup)
#調(diào)節(jié)各Widget的比例字币,此處的addStretch(1)作用使得configGroup置頂
mainLayout.addStretch(1)
self.setLayout(mainLayout)
# CheckBox候選框+ListWidget
class UpdatePage(QWidget):
def __init__(self, parent=None):
super(UpdatePage, self).__init__(parent)
updateGroup = QGroupBox("Package selection")
#定義三組多選框
systemCheckBox = QCheckBox("Update system")
appsCheckBox = QCheckBox("Update applications")
docsCheckBox = QCheckBox("Update documentation")
packageGroup = QGroupBox("Existing packages")
# ListWidget列表視圖
packageList = QListWidget()
qtItem = QListWidgetItem(packageList)
qtItem.setText("Qt")
qsaItem = QListWidgetItem(packageList)
qsaItem.setText("QSA")
teamBuilderItem = QListWidgetItem(packageList)
teamBuilderItem.setText("Teambuilder")
# 定義啟動Push Button
startUpdateButton = QPushButton("Start update")
updateLayout = QVBoxLayout()
updateLayout.addWidget(systemCheckBox)
updateLayout.addWidget(appsCheckBox)
updateLayout.addWidget(docsCheckBox)
updateGroup.setLayout(updateLayout)
packageLayout = QVBoxLayout()
packageLayout.addWidget(packageList)
packageGroup.setLayout(packageLayout)
mainLayout = QVBoxLayout()
mainLayout.addWidget(updateGroup)
mainLayout.addWidget(packageGroup)
mainLayout.addSpacing(12)
mainLayout.addWidget(startUpdateButton)
mainLayout.addStretch(1)
self.setLayout(mainLayout)
# 采用GridLayout網(wǎng)格布局
class QueryPage(QWidget):
def __init__(self, parent=None):
super(QueryPage, self).__init__(parent)
packagesGroup = QGroupBox("Look for packages")
nameLabel = QLabel("Name:")
nameEdit = QLineEdit()
dateLabel = QLabel("Released after:")
dateEdit = QDateTimeEdit(QDate.currentDate())
releasesCheckBox = QCheckBox("Releases")
upgradesCheckBox = QCheckBox("Upgrades")
hitsSpinBox = QSpinBox()
hitsSpinBox.setPrefix("Return up to ")
hitsSpinBox.setSuffix(" results")
hitsSpinBox.setSpecialValueText("Return only the first result")
hitsSpinBox.setMinimum(1)
hitsSpinBox.setMaximum(100)
hitsSpinBox.setSingleStep(10)
startQueryButton = QPushButton("Start query")
'''
void QGridLayout::addWidget(QWidget * widget, int fromRow, int
fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
各參數(shù)表示分別為控件名,行共缕,列洗出,占用行數(shù),占用列數(shù)图谷,對齊方式
'''
packagesLayout = QGridLayout()
packagesLayout.addWidget(nameLabel, 0, 0)
packagesLayout.addWidget(nameEdit, 0, 1)
packagesLayout.addWidget(dateLabel, 1, 0)
packagesLayout.addWidget(dateEdit, 1, 1)
packagesLayout.addWidget(releasesCheckBox, 2, 0)
packagesLayout.addWidget(upgradesCheckBox, 3, 0)
packagesLayout.addWidget(hitsSpinBox, 4, 0, 1, 2)
packagesGroup.setLayout(packagesLayout)
mainLayout = QVBoxLayout()
mainLayout.addWidget(packagesGroup)
mainLayout.addSpacing(12)
mainLayout.addWidget(startQueryButton)
mainLayout.addStretch(1)
self.setLayout(mainLayout)
# 主UI界面
class ConfigDialog(QDialog):
def __init__(self, parent=None):
super(ConfigDialog, self).__init__(parent)
self.contentsWidget = QListWidget()
self.contentsWidget.setViewMode(QListView.IconMode)
self.contentsWidget.setIconSize(QSize(150, 180))
self.contentsWidget.setMovement(QListView.Static)
self.contentsWidget.setMaximumWidth(128)
self.contentsWidget.setSpacing(12)
'''
QStackedWidget繼承自QFrame翩活。
QStackedWidget類提供了多頁面切換的布局,一次只能看到一個界面便贵。
'''
self.pagesWidget = QStackedWidget()
self.pagesWidget.addWidget(ConfigurationPage())
self.pagesWidget.addWidget(UpdatePage())
self.pagesWidget.addWidget(QueryPage())
closeButton = QPushButton("Close")
self.createIcons()
self.contentsWidget.setCurrentRow(0)
# 點擊close Button關閉界面
closeButton.clicked.connect(self.close)
horizontalLayout = QHBoxLayout()
horizontalLayout.addWidget(self.contentsWidget)
horizontalLayout.addWidget(self.pagesWidget, 1)
buttonsLayout = QHBoxLayout()
buttonsLayout.addStretch(1)
buttonsLayout.addWidget(closeButton)
mainLayout = QVBoxLayout()
mainLayout.addLayout(horizontalLayout)
mainLayout.addStretch(1)
mainLayout.addSpacing(12)
mainLayout.addLayout(buttonsLayout)
self.setLayout(mainLayout)
self.setWindowTitle("Config Dialog")
#如果上一張Page與當前的Page不同隅茎,將pagesWidget設定為當前Page
def changePage(self, current, previous):
if not current:
current = previous
self.pagesWidget.setCurrentIndex(self.contentsWidget.row(current))
#為config/update/query制作圖片logo,注意import configdialog_rc嫉沽,否者圖片加載不到
def createIcons(self):
configButton = QListWidgetItem(self.contentsWidget)
configButton.setIcon(QIcon(':/images/config.png'))
configButton.setText("Configuration")
configButton.setTextAlignment(Qt.AlignHCenter)
configButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
updateButton = QListWidgetItem(self.contentsWidget)
updateButton.setIcon(QIcon(':/images/update.png'))
updateButton.setText("Update")
updateButton.setTextAlignment(Qt.AlignHCenter)
updateButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
queryButton = QListWidgetItem(self.contentsWidget)
queryButton.setIcon(QIcon(':/images/query.png'))
queryButton.setText("Query")
queryButton.setTextAlignment(Qt.AlignHCenter)
queryButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
#為contentsWidget界面切換添加changePage響應
self.contentsWidget.currentItemChanged.connect(self.changePage)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
dialog = ConfigDialog()
sys.exit(dialog.exec_())
今天有些晚,待續(xù)俏竞。绸硕。。
CC