成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用PyQt打造具有專業外觀的GUI(中篇)

開發 后端
您可以使用嵌套布局來創建復雜的GUI,而使用通用PyQt的布局管理器之一很難創建這些GUI。

 用 PyQt 打造具有專業外觀的GUI(上篇)

快速創建表單:QFormLayout

如果您一直在創建表單以執行將數據輸入數據庫等操作,那么QFormLayout適合您。此類將小部件布置為兩列布局。第一列通常顯示描述預期輸入的標簽,第二列通常包含允許用戶輸入或編輯數據的輸入小部件,例如QLineEdit,QComboBox或QSpinBox。

要將小部件添加到表單布局,請使用.addRow()。此方法有多種變量,但是在大多數情況下,您可以從以下兩種進行選擇:

  •  .addRow(label,field)將新行添加到表單布局的底部。該行應包含一個QLabel對象(label)和一個輸入小部件(field))。
  •  .addRow(labelText,field)自動創建并添加帶有labelText作為其文本的新QLabel對象。字段. field包含一個輸入小部件。

這是一個使用QFormLayout對象排列小部件的示例應用程序: 

  1. import sys  
  2. from PyQt5.QtWidgets import (  
  3.     QApplication,  
  4.     QFormLayout,  
  5.     QLabel,  
  6.     QLineEdit, 
  7.     QWidget,  
  8.  
  9. class Window(QWidget):  
  10.     def __init__(self):  
  11.         super().__init__()  
  12.         self.setWindowTitle("QFormLayout Example")  
  13.         self.resize(270, 110)  
  14.         # Create a QHBoxLayout instance  
  15.         layout = QFormLayout()  
  16.         # Add widgets to the layout  
  17.         layout.addRow("Name:", QLineEdit())  
  18.         layout.addRow("Job:", QLineEdit())  
  19.         emailLabel = QLabel("Email:")  
  20.         layout.addRow(emailLabel, QLineEdit())  
  21.         # Set the layout on the application's window  
  22.         self.setLayout(layout)  
  23. if __name__ == "__main__":  
  24.     app = QApplication(sys.argv)  
  25.     window = Window()  
  26.     window.show() 
  27.      sys.exit(app.exec_()) 

在第17行,創建一個QFormLayout對象。然后,在第19至22行上,向布局中添加一些行。請注意,在第19行和第20行,您使用方法的第二個變量,在第22行,您使用第一個變量,將QLabel對象作為第一個參數傳遞給.addRow()。

如果您運行此代碼,則會在屏幕上看到以下窗口:

[[359059]]

使用QFormLayout,可以以兩列的方式組織小部件。第一列包含標簽,要求用戶提供一些信息。第二列顯示允許用戶輸入或編輯該信息的小部件。

嵌套布局以構建復雜的GUI

您可以使用嵌套布局來創建復雜的GUI,而使用通用PyQt的布局管理器之一很難創建這些GUI。為此,您需要在外部布局上調用.addLayout()。這樣,內部布局成為外部布局的子級。

假設您需要創建一個對話框,該對話框在表單布局中顯示標簽和行編輯,并且在這些小部件下方您要在垂直布局中放置多個復選框。這是您的對話框外觀的模型:

藍色矩形代表您的外部布局。綠色矩形是將保留標簽和行編輯的表單布局。紅色矩形是用于容納選項復選框的垂直布局。綠色布局和紅色布局都嵌套在藍色布局中,藍色布局是垂直布局。

這是一個如何使用PyQt構建此布局的示例: 

  1. import sys  
  2. from PyQt5.QtWidgets import (  
  3.     QApplication,  
  4.     QCheckBox,  
  5.     QFormLayout,  
  6.     QLineEdit,  
  7.     QVBoxLayout,  
  8.     QWidget,  
  9.  
  10. class Window(QWidget):  
  11.     def __init__(self):  
  12.         super().__init__()  
  13.         self.setWindowTitle("Nested Layouts Example")  
  14.         # Create an outer layout  
  15.         outerLayout = QVBoxLayout()  
  16.         # Create a form layout for the label and line edit  
  17.         topLayout = QFormLayout()  
  18.         # Add a label and a line edit to the form layout  
  19.         topLayout.addRow("Some Text:", QLineEdit())  
  20.         # Create a layout for the checkboxes  
  21.         optionsLayout = QVBoxLayout()  
  22.         # Add some checkboxes to the layout  
  23.         optionsLayout.addWidget(QCheckBox("Option one"))  
  24.         optionsLayout.addWidget(QCheckBox("Option two"))  
  25.         optionsLayout.addWidget(QCheckBox("Option three"))  
  26.         # Nest the inner layouts into the outer layout  
  27.         outerLayout.addLayout(topLayout)  
  28.         outerLayout.addLayout(optionsLayout)  
  29.         # Set the window's main layout  
  30.         self.setLayout(outerLayout)  
  31. if __name__ == "__main__":  
  32.     app = QApplication(sys.argv)  
  33.     window = Window()  
  34.     window.show()  
  35.     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()。

這是一個示例,展示了如何使用帶有組合框的堆疊式布局在頁面之間進行切換: 

  1. import sys  
  2. from PyQt5.QtWidgets import ( 
  3.     QApplication,  
  4.     QComboBox,  
  5.     QFormLayout,  
  6.     QLineEdit,  
  7.     QStackedLayout,  
  8.     QVBoxLayout,  
  9.     QWidget,  
  10.  
  11. class Window(QWidget):  
  12.     def __init__(self):  
  13.         super().__init__()  
  14.         self.setWindowTitle("QStackedLayout Example")  
  15.         # Create a top-level layout  
  16.         layout = QVBoxLayout()  
  17.         self.setLayout(layout)  
  18.         # Create and connect the combo box to switch between pages  
  19.         self.pageCombo = QComboBox()  
  20.         self.pageCombo.addItems(["Page 1", "Page 2"])  
  21.         self.pageCombo.activated.connect(self.switchPage)  
  22.         # Create the stacked layout  
  23.         self.stackedLayout = QStackedLayout()  
  24.         # Create the first page  
  25.         self.page1 = QWidget()  
  26.         self.page1Layout = QFormLayout()  
  27.         self.page1Layout.addRow("Name:", QLineEdit())  
  28.         self.page1Layout.addRow("Address:", QLineEdit())  
  29.         self.page1.setLayout(self.page1Layout)  
  30.         self.stackedLayout.addWidget(self.page1)  
  31.         # Create the second page  
  32.         self.page2 = QWidget()  
  33.         self.page2Layout = QFormLayout()  
  34.         self.page2Layout.addRow("Job:", QLineEdit())  
  35.         self.page2Layout.addRow("Department:", QLineEdit())  
  36.         self.page2.setLayout(self.page2Layout)  
  37.         self.stackedLayout.addWidget(self.page2)  
  38.         # Add the combo box and the stacked layout to the top-level layout  
  39.         layout.addWidget(self.pageCombo)  
  40.         layout.addLayout(self.stackedLayout)  
  41.     def switchPage(self): 
  42.         self.stackedLayout.setCurrentIndex(self.pageCombo.currentIndex())  
  43. if __name__ == "__main__":  
  44.     app = QApplication(sys.argv)  
  45.     window = Window()  
  46.     window.show()  
  47.     sys.exit(app.exec_()) 

在第21至23行,您將創建一個QComboBox對象,該對象將允許您在布局中的頁面之間進行切換。然后,在列表的組合框中添加兩個選項,并將其連接到旨在處理頁面切換的.switchPage()。

在.switchPage()內部,您在布局對象上調用.setCurrentIndex(),將組合框的當前索引作為參數傳遞。這樣,當用戶更改組合框中的選項時,堆疊版式上的頁面將相應地更改。

在第25行上,創建QStackedLayout對象。在第27至32行上,將第一頁添加到布局中,在第34至39行上,將第二頁添加到布局中。每個頁面都由一個QWidget對象表示,該對象以方便的布局包含多個小部件。

使一切正常運行的最后一步是將組合框和布局添加到應用程序的主布局。

現在,您的應用程序的行為如下:

在這種情況下,您的應用程序布局中有兩個頁面。每個頁面由一個QWidget對象表示。當您在窗口頂部的組合框中選擇一個新頁面時,布局將更改以顯示所選頁面。

除了堆疊的布局和堆疊的小部件,您還可以使用QTabWidget創建多頁用戶界面。您將在下一節中學習如何操作。

使用PyQt的標簽小部件

在PyQt中創建多頁排列的另一種流行方式是使用稱為QTabWidget的類。此類提供標簽欄和頁面區域。您可以使用選項卡欄在頁面之間切換,并使用頁面區域顯示與所選選項卡關聯的頁面。

默認情況下,選項卡欄位于頁面區域的頂部。但是,可以使用.setTabPosition()和四個可能的選項卡位置之一來更改此行為:

要將選項卡添加到選項卡小部件,請使用.addTab()。此方法有兩個變量或重載的實現:

1、.addTab(page, label)

2、.addTab(page, icon, label)

在這兩種情況下,該方法都會添加一個新標簽,label為標簽標題。. page必須是一個小部件,代表與手邊的選項卡關聯的頁面。

在該方法的第二變量中,圖標必須是QIcon對象。如果您將圖標傳遞給.addTab(),則該圖標將顯示在標簽標題的左側。

創建選項卡小部件時的常見做法是為每個頁面使用QWidget對象。這樣,您就可以使用包含所需窗口小部件的布局向頁面添加額外的窗口小部件。

大多數情況下,您將使用標簽小部件為GUI應用程序創建對話框。這種布局允許您在相對較小的空間中為用戶提供多個選項。您還可以利用選項卡系統根據一些分類標準來組織選項。

這是一個示例應用程序,顯示了如何創建和使用QTabWidget對象的基礎知識: 

  1. import sys  
  2. from PyQt5.QtWidgets import (  
  3.     QApplication,  
  4.     QCheckBox,  
  5.     QTabWidget,  
  6.     QVBoxLayout,  
  7.     QWidget,  
  8.  
  9. class Window(QWidget):  
  10.     def __init__(self):  
  11.         super().__init__()  
  12.         self.setWindowTitle("QTabWidget Example")  
  13.         self.resize(270, 110)  
  14.         # Create a top-level layout  
  15.         layout = QVBoxLayout()  
  16.         self.setLayout(layout)  
  17.         # Create the tab widget with two tabs  
  18.         tabs = QTabWidget()  
  19.         tabs.addTab(self.generalTabUI(), "General")  
  20.         tabs.addTab(self.networkTabUI(), "Network")  
  21.         layout.addWidget(tabs)  
  22.     def generalTabUI(self):  
  23.         """Create the General page UI."""  
  24.         generalTab = QWidget()  
  25.         layout = QVBoxLayout()  
  26.         layout.addWidget(QCheckBox("General Option 1"))  
  27.         layout.addWidget(QCheckBox("General Option 2"))  
  28.         generalTab.setLayout(layout)  
  29.         return generalTab  
  30.     def networkTabUI(self):  
  31.         """Create the Network page UI."""  
  32.         networkTab = QWidget()  
  33.         layout = QVBoxLayout()  
  34.         layout.addWidget(QCheckBox("Network Option 1"))  
  35.         layout.addWidget(QCheckBox("Network Option 2"))  
  36.         networkTab.setLayout(layout)  
  37.         return networkTab  
  38. if __name__ == "__main__":  
  39.     app = QApplication(sys.argv)  
  40.     window = Window()  
  41.     window.show()  
  42.     sys.exit(app.exec_()) 

在此示例中,您使用選項卡小部件向用戶顯示一個簡潔的對話框,該對話框顯示與假設首選項菜單的“常規”和“網絡”部分相關的選項。在第20行上,創建QTabWidget對象。然后,使用.addTab()將兩個選項卡添加到選項卡小部件。

在.generalTabUI()和networkTabUI()中,為每個選項卡創建特定的GUI。為此,您可以使用QWidget對象,QVBoxLayout對象和一些復選框來保存選項。

如果立即運行該應用程序,則屏幕上將顯示以下對話框:

您有一個功能齊全的基于選項卡的GUI。請注意,要在頁面之間切換,只需單擊相應的選項卡。 

 

責任編輯:龐桂玉 來源: Python中文社區(ID:python-china)
相關推薦

2020-12-18 10:01:51

PyQtGUIPython

2023-05-17 12:43:01

SnapUbuntu

2021-06-10 10:26:03

PythonGUI軟件包

2023-11-23 13:10:24

Python框架

2012-01-09 13:55:35

Java

2021-11-11 16:14:15

NVIDIA

2011-06-17 17:01:22

Qt Eclipse Windows

2018-09-21 15:26:45

大數據管理系統

2010-08-25 14:14:14

互聯網營銷平臺

2012-11-07 15:26:36

惠普打印機

2009-09-22 12:11:42

ibmdwLotus

2022-03-29 12:40:35

Linux樹莓派

2022-06-24 09:58:52

CurtailLinux

2011-06-23 18:04:42

Qt Embedded

2009-07-10 15:18:48

Synth外觀Swing外觀

2019-11-07 22:12:50

網絡網絡體檢網絡技術

2024-12-10 08:31:22

2009-03-18 18:37:36

多核服務器英特爾

2016-01-05 13:22:42

技術架構SaaS客服平臺
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲在线视频 | 国产精品久久国产精品久久 | 欧美成人不卡 | 在线观看亚洲专区 | 欧美黄色一级毛片 | 久久久成人网 | 中文字幕一区二区三区乱码在线 | av黄色在线观看 | 亚洲视频 欧美视频 | 日本不卡高清视频 | 国产三区av | 欧美三级久久久 | 亚洲91av| 欧美日韩中文字幕在线 | 国产精品资源在线 | 久久福利网站 | 亚洲毛片一区二区 | 免费看的av | 中文字幕不卡在线观看 | 国产精品视频网 | 一区二区播放 | 亚洲视频国产视频 | 毛片网站免费观看 | 国产毛片视频 | jizz中国日本 | 天天操夜夜操 | 91精品国产综合久久精品 | 正在播放一区二区 | 午夜国产一级片 | 久久精品在线 | 日韩精品不卡 | 亚洲精品一 | 伊人婷婷| 欧美日韩一 | 中文字幕亚洲在线 | 色婷婷亚洲国产女人的天堂 | 四虎影院在线观看免费视频 | 亚洲毛片在线 | 久久精品视频在线免费观看 | 日韩欧美电影在线 | 成人高清视频在线观看 |