用 PyQt 打造具有专业外观的 GUI
快速创建表单:QFormLayout
QFormLayout
适合您。此类将小部件布置为两列布局。第一列通常显示描述预期输入的标签,第二列通常包含允许用户输入或编辑数据的输入小部件,例如QLineEdit
,QComboBox
或QSpinBox
。.addRow()
。此方法有多种变量,但是在大多数情况下,您可以从以下两种进行选择:-
.addRow(label,field)
将新行添加到表单布局的底部。该行应包含一个QLabel
对象(label
)和一个输入小部件(field)
)。 -
.addRow(labelText,field)
自动创建并添加带有labelText
作为其文本的新QLabel
对象。字段. field
包含一个输入小部件。
QFormLayout
对象排列小部件的示例应用程序:import sys
from PyQt5.QtWidgets import (
QApplication,
QFormLayout,
QLabel,
QLineEdit,
QWidget,
)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QFormLayout Example")
self.resize(270, 110)
# Create a QHBoxLayout instance
layout = QFormLayout()
# Add widgets to the layout
layout.addRow("Name:", QLineEdit())
layout.addRow("Job:", QLineEdit())
emailLabel = QLabel("Email:")
layout.addRow(emailLabel, QLineEdit())
# Set the layout on the application's window
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
QFormLayout
对象。然后,在第19至22行上,向布局中添加一些行。请注意,在第19行和第20行,您使用方法的第二个变量,在第22行,您使用第一个变量,将QLabel对象作为第一个参数传递给.addRow()
。QFormLayout
,可以以两列的方式组织小部件。第一列包含标签,要求用户提供一些信息。第二列显示允许用户输入或编辑该信息的小部件。.addLayout()
。这样,内部布局成为外部布局的子级。import sys
from PyQt5.QtWidgets import (
QApplication,
QCheckBox,
QFormLayout,
QLineEdit,
QVBoxLayout,
QWidget,
)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Nested Layouts Example")
# Create an outer layout
outerLayout = QVBoxLayout()
# Create a form layout for the label and line edit
topLayout = QFormLayout()
# Add a label and a line edit to the form layout
topLayout.addRow("Some Text:", QLineEdit())
# Create a layout for the checkboxes
optionsLayout = QVBoxLayout()
# Add some checkboxes to the layout
optionsLayout.addWidget(QCheckBox("Option one"))
optionsLayout.addWidget(QCheckBox("Option two"))
optionsLayout.addWidget(QCheckBox("Option three"))
# Nest the inner layouts into the outer layout
outerLayout.addLayout(topLayout)
outerLayout.addLayout(optionsLayout)
# Set the window's main layout
self.setLayout(outerLayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
-
在第17行,您将创建外部或顶层布局,将其用作父布局和窗口的主布局。在这种情况下,使用 QVBoxLayout
是因为您希望将小部件垂直排列在窗体上。在您的模型中,这是蓝色布局。 -
在第19行,您创建一个表单布局来保存标签和行编辑。 -
在第21行,将所需的小部件添加到布局中。这等效于您的绿色布局。 -
在第23行,您将创建一个垂直布局来容纳复选框。 -
在第25至27行上,添加所需的复选框。这是您的红色布局。 -
在第29和30行上,将 topLayout
和optionsLayout
嵌套在outsideLayout
下。
.addWidget()
。这会将每个小部件添加到布局内部小部件列表的末尾。您还可以分别使用.insertWidget(index)
或.removeWidget(widget)
在小部件列表中的给定位置插入或删除小部件。.count()
。.setCurrentIndex()
。import sys
from PyQt5.QtWidgets import (
QApplication,
QComboBox,
QFormLayout,
QLineEdit,
QStackedLayout,
QVBoxLayout,
QWidget,
)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QStackedLayout Example")
# Create a top-level layout
layout = QVBoxLayout()
self.setLayout(layout)
# Create and connect the combo box to switch between pages
self.pageCombo = QComboBox()
self.pageCombo.addItems(["Page 1", "Page 2"])
self.pageCombo.activated.connect(self.switchPage)
# Create the stacked layout
self.stackedLayout = QStackedLayout()
# Create the first page
self.page1 = QWidget()
self.page1Layout = QFormLayout()
self.page1Layout.addRow("Name:", QLineEdit())
self.page1Layout.addRow("Address:", QLineEdit())
self.page1.setLayout(self.page1Layout)
self.stackedLayout.addWidget(self.page1)
# Create the second page
self.page2 = QWidget()
self.page2Layout = QFormLayout()
self.page2Layout.addRow("Job:", QLineEdit())
self.page2Layout.addRow("Department:", QLineEdit())
self.page2.setLayout(self.page2Layout)
self.stackedLayout.addWidget(self.page2)
# Add the combo box and the stacked layout to the top-level layout
layout.addWidget(self.pageCombo)
layout.addLayout(self.stackedLayout)
def switchPage(self):
self.stackedLayout.setCurrentIndex(self.pageCombo.currentIndex())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
QComboBox
对象,该对象将允许您在布局中的页面之间进行切换。然后,在列表的组合框中添加两个选项,并将其连接到旨在处理页面切换的.switchPage()
。.switchPage()
内部,您在布局对象上调用.setCurrentIndex()
,将组合框的当前索引作为参数传递。这样,当用户更改组合框中的选项时,堆叠版式上的页面将相应地更改。QStackedLayout
对象。在第27至32行上,将第一页添加到布局中,在第34至39行上,将第二页添加到布局中。每个页面都由一个QWidget
对象表示,该对象以方便的布局包含多个小部件。QWidget
对象表示。当您在窗口顶部的组合框中选择一个新页面时,布局将更改以显示所选页面。QTabWidget
创建多页用户界面。您将在下一节中学习如何操作。QTabWidget
的类。此类提供标签栏和页面区域。您可以使用选项卡栏在页面之间切换,并使用页面区域显示与所选选项卡关联的页面。.setTabPosition()
和四个可能的选项卡位置之一来更改此行为:.addTab()
。此方法有两个变量或重载的实现:.addTab(page, label)
.addTab(page, icon, label)
label
为标签标题。. page
必须是一个小部件,代表与手边的选项卡关联的页面。QIcon
对象。如果您将图标传递给.addTab()
,则该图标将显示在标签标题的左侧。QWidget
对象。这样,您就可以使用包含所需窗口小部件的布局向页面添加额外的窗口小部件。QTabWidget
对象的基础知识:import sys
from PyQt5.QtWidgets import (
QApplication,
QCheckBox,
QTabWidget,
QVBoxLayout,
QWidget,
)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QTabWidget Example")
self.resize(270, 110)
# Create a top-level layout
layout = QVBoxLayout()
self.setLayout(layout)
# Create the tab widget with two tabs
tabs = QTabWidget()
tabs.addTab(self.generalTabUI(), "General")
tabs.addTab(self.networkTabUI(), "Network")
layout.addWidget(tabs)
def generalTabUI(self):
"""Create the General page UI."""
generalTab = QWidget()
layout = QVBoxLayout()
layout.addWidget(QCheckBox("General Option 1"))
layout.addWidget(QCheckBox("General Option 2"))
generalTab.setLayout(layout)
return generalTab
def networkTabUI(self):
"""Create the Network page UI."""
networkTab = QWidget()
layout = QVBoxLayout()
layout.addWidget(QCheckBox("Network Option 1"))
layout.addWidget(QCheckBox("Network Option 2"))
networkTab.setLayout(layout)
return networkTab
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
QTabWidget
对象。然后,使用.addTab()
将两个选项卡添加到选项卡小部件。.generalTabUI()
和networkTabUI()
中,为每个选项卡创建特定的GUI。为此,您可以使用QWidget
对象,QVBoxLayout
对象和一些复选框来保存选项。