当前位置: 首页 > 科技观察

使用PyQt创建具有专业外观的GUI(第2部分)

时间:2023-03-13 23:50:29 科技观察

使用PyQt创建具有专业外观的GUI(第1部分)快速创建表单:QFormLayout如果您一直在创建表单以执行诸如将数据输入数据库等操作,那么QFormLayout适合你。此类以两列布局布置小部件。第一列通常显示描述预期输入的标签,第二列通常包含允许用户输入或编辑数据的输入小部件,例如QLineEdit、QComboBox或QSpinBox。要将小部件添加到表单布局,请使用.addRow()。此方法有多种变体,但在大多数情况下,您可以从两种变体中进行选择:.addRow(label,field)在表单布局的底部添加一个新行。该行应包含一个QLabel对象(标签)和一个输入小部件(字段))。.addRow(labelText,field)自动创建并添加一个新的QLabel对象,并将labelText作为其文本。场地。字段包含一个输入小部件。这是一个使用QFormLayout对象来排列小部件的示例应用程序:importsysfromPyQt5.QtWidgets("QFormLayoutExample")self.resize(270,110)#CreateaQHBoxLayoutinstancelayout=QFormLayout()#Addwidgetstothelayoutlayout.addRow("Name:",QLineEdit())layout.addRow("Job:",QLineEdit())emailLabel=QLabel("Email:")layout.addRow(emailLabel,QLineEdit())#Setthelayoutontheapplication'swindowsself.setLayout(layout)if__name__=="__main__":app=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())在第17行,创建了一个QFormLayout对象。然后,在第19到22行,向布局添加一些行。请注意,在第19行和第20行,您使用了该方法的第二个变量,而在第22行,您使用了第一个变量,将QLabel对象作为第一个参数传递给.addRow()。如果运行此代码,您将在屏幕上看到以下窗口:使用QFormLayout,可以将小部件组织成两列。第一列包含标签,要求用户提供一些信息。第二列显示允许用户输入或编辑该信息的小部件。嵌套布局以构建复杂的GUI您可以使用嵌套布局来创建复杂的GUI,使用通用PyQt的布局管理器之一很难创建这些GUI。为此,您需要在外部布局上调用.addLayout()。这样,内部布局成为外部布局的子布局。假设您需要创建一个对话框,在表单布局中显示标签和行编辑,并在这些小部件下方以垂直布局放置多个复选框。这是您的对话框的外观模型:蓝色矩形代表您的外部布局。绿色矩形是将保留标签和行编辑的表单布局。红色矩形是包含选项复选框的垂直布局。绿色布局和红色布局都嵌套在蓝色布局中,这是一个垂直布局。以下是如何使用PyQt构建此布局的示例:"NestedLayoutsExample")#CreateanouterlayoutouterLayout=QVBoxLayout()#CreateaformlayoutforthelabelandlineedittopLayout=QFormLayout()#AddalabelandalineedittotheformlayouttopLayout.addRow("SomeText:",QLineEdit())#CreatealayoutforthecheckboxesoptionsLayout=QVBoxLayout()#AddsomecheckboxestothelayoutoptionsLayout.addWidget(QCheckBox("Optionone"))optionsLayout。addWidget(QCheckBox("Optiontwo"))optionsLayout.addWidget(QCheckBox("Optionthree"))#将内部布局嵌套到外部布局outouterLayout.addLayout(topLayout)outerLayout.addLayout(optionsLayout)#Setthewindow的mainlayoutself.setLayout(=="__main__Layout)if__name__=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())这是你的代码您在做什么:在第17行,您创建了外部或顶层布局,它将用作窗口的父布局和主布局。在这种情况下,使用QVBoxLayout是因为您希望小部件在窗体上垂直排列。在您的模型中,这是蓝色布局。在第19行,您创建了一个表单布局来保存标签和行编辑。在第21行,将所需的小部件添加到布局中。这相当于你的绿色布局。在第23行,您创建了一个垂直布局来放置复选框。在第25到27行,添加所需的复选框。这是你的红色布局。在第29和30行,将topLayout和optionsLayout嵌套在outsideLayout下。如果您运行该应用程序,您将看到一个类似于以下内容的窗口:在此应用程序中,您在外部布局下嵌套了两个不同的布局以创建窗口的通用布局。在窗口的顶部,选项卡和行编辑使用水平布局放置。然后,使用垂直布局在其下方放置一些复选框。使用多页布局和小部件到目前为止,您已经了解了如何使用传统或通用布局管理器在应用程序窗口中安排小部件。这些布局管理器在单页布局上排列小部件。换句话说,您的GUI将始终向用户显示同一组小部件。有时您需要创建一个布局来显示一组不同的小部件,以响应GUI上的某些用户操作。例如,如果您正在为给定的应用程序创建首选项对话框,您可能需要向用户呈现基于选项卡或多页面的布局,其中每个选项卡或页面包含一组不同的密切相关的选项。每次用户单击选项卡或页面时,应用程序都会显示一组不同的小部件。PyQt提供了一个名为QStackedLayout的内置布局以及一些方便的小部件(例如QTabWidget),可以让您创建这样的多页面布局。接下来的几节将向您介绍其中一些工具。创建小部件堆栈QStackedLayout提供了一个布局管理器,允许您在堆栈上安排小部件,一个在另一个之上。在此布局中,在给定时间只有一个小部件可见。要使用小部件填充堆叠布局,您需要在布局对象上调用.addWidget()。这会将每个小部件添加到布局的内部小部件列表的末尾。您还可以分别使用.insertWidget(index)或.removeWidget(widget)在小部件列表中的给定位置插入或删除小部件。小部件列表中的每个小部件都显示为一个独立的页面。如果要在页面上显示多个小部件,请为每个页面使用一个QWidget对象,并为页面小部件设置适当的小部件布局。如果需要获取布局中的小部件(页面)总数,可以调用.count()。使用QStackedLayout对象时要记住的重要一点是,您需要明确提供一种在页面之间切换的机制。否则,您的布局将始终向用户显示相同的页面。要在页面之间切换,您需要在布局对象上调用.setCurrentIndex()。这是一个示例,显示如何使用带有组合框的堆叠布局在页面之间切换:.__init__()self.setWindowTitle("QStackedLayoutExample")#Createatop-levellayoutlayout=QVBoxLayout()self.setLayout(layout)#Createandconnectthecomboboxtoswitchbetweenpagesself.pageCombo=QComboBox()self.pageCombo.addItems(["Page1,"Page2"])self....page1Layout.addRow("Address:",QLineEdit())self.page1.setLayout(self.page1Layout)self.stackedLayout.addWidget(self.page1)#Createthesecondpageself.page2=QWidget()self.page2Layout=QFormLayout()self.page2Layout.addRow("工作:",QLineEdit())self.page2Layout.addRow("Department:",QLineEdit())self.page2.setLayout(self.page2Layout)self.stackedLayout.addWidget(self.page2)#Addthecomboboxandthackedlayouttothetop-levellayoutlayout.addWidget(self.pageCombo)layout.addLayout(self.stackedLayout)defswitchPage(self):self.stackedLayout.setCurrentIndex(self.pageCombo.currentIndex())if__name__=="__main__":app=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())在第21到23行,您创建了一个QComboBox对象,它允许您在布局中的页面之间切换。然后,在列表中的组合框中添加两个选项,并将连接设置为.switchPage()用于处理页面切换。在.switchPage()内部,您在布局对象上调用.setCurrentIndex(),将组合框的当前索引作为参数传递。这样,当用户更改组合框中的选项时,堆叠布局上的页面将相应更改。在第25行,创建了QStackedLayout对象。在第27到32行,将第一页添加到布局中,在第34到39行,将第二页添加到布局中。每个页面都由一个QWidget对象表示,该对象在方便的布局中包含多个小部件。让一切正常工作的最后一步是将组合框和布局添加到应用程序的主布局。您的应用程序现在的行为如下:在这种情况下,您的应用程序布局中有两个页面。每个页面都由一个QWidget对象表示。当您在窗口顶部的组合框中选择一个新页面时,布局会更改以显示所选页面。除了堆叠布局和堆叠小部件之外,您还可以使用QTabWidget来创建多页用户界面。您将在下一节中了解如何操作。使用PyQt的TabWidget在PyQt中创建多页面排列的另一种流行方法是使用名为QTabWidget的类。此类提供选项卡栏和页面区域。您可以使用选项卡栏在页面之间切换,页面区域显示与所选选项卡关联的页面。默认情况下,选项卡栏位于页面区域的顶部。但是,可以使用.setTabPosition()和四个可能的选项卡位置之一更改此行为:要将选项卡添加到选项卡小部件,请使用.addTab()。此方法有两种变体或重载实现:1..addTab(page,label)2..addTab(page,icon,label)在这两种情况下,该方法都会添加一个新选项卡,其中label是标签标题。.page必须是代表与当前选项卡关联的页面的小部件。在方法的第二个变体中,图标必须是QIcon对象。如果将图标传递给.addTab(),该图标将出现在选项卡标题的左侧。创建选项卡小部件时的常见做法是为每个页面使用QWidget对象。这样,您可以使用包含所需小部件的布局向页面添加其他小部件。大多数时候,您将使用标签小部件为GUI应用程序创建对话框。这种布局允许您在相对较小的空间内为用户提供多种选择。您还可以使用选项卡系统根据某些排序标准来组织选项。下面是一个示例应用程序,展示了如何创建和使用QTabWidget对象的基础知识:self.setWindowTitle("QTabWidgetExample")self.resize(270,110)#Createatop-levellayoutlayout=QVBoxLayout()self.setLayout(layout)#Createthetabwidgetwithtwotabstabs=QTabWidget()tabs.addTab(self.generalTabUI(),"General")tabs。addTab(self.networkTabUI(),"Network")layout.addWidget(tabs)defgeneralTabUI(self):"""CreatetheGeneralpageUI."""generalTab=QWidget()layout=QVBoxLayout()layout.addWidget(QCheckBox("GeneralOption1"))layout.addWidget(QCheckBox("GeneralOption2"))generalTab.setLayout(layout)returngeneralTabdefnetworkTabUI(self):"""CreatetheNetworkpageUI."""networkTab=QWidget()layout=QVBoxLayout()layout.addWidget(QCheckBox("NetworkOption1"))layout.addWidget(QCheckBox("NetworkOption2"))networkTab.setLayout(layout)返回networkTabif__name__=="__main__":app=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())在此示例中,您使用选项卡小部件向用户呈现一个简洁的对话框,该对话框显示与假设的首选项菜单的常规和网络部分相关的选项在第20行,创建QTabWidget对象。然后,使用.addTab()将这两个选项卡添加到选项卡小部件。在.generalTabUI()和networkTabUI()中,为每个选项卡创建特定的GUI。为此,您使用QWidget对象、QVBoxLayout对象和一些复选框来保存选项。如果您现在运行该应用程序,屏幕上将出现以下对话框:您有一个功能齐全的基于选项卡的GUI。请注意,要在页面之间切换,只需单击相应的选项卡即可。