PyQt4 工具包簡介
1.1 關於本指南 這是一個入門級的 PyQt 指南。其目的在於引導讀者快速上手 PyQt4 工具包。該指南在 Linux 環境下建立並經過測試。 關於 PyQt PyQt 是用來建立 GUI 應用程序的工具包。它是 Python 編程語言與已得到成功的 Qt 庫 的 混 合 體 。 其 中 Qt 庫 是 這 個 星 球 上 最 強 大 的 GUI 庫 之 一 。 PyQt 的 官 方 網 站 是 http://www.riverbankcomputing.com/software/pyqt/intro 它由 Phil Thompson 建立。 PyQt 的實現被視做 Python 的一個模塊。它由 300 多個類和接近 6000 個函數與方法構 成。做爲一個跨平臺的工具包,PyQt 能夠在全部主流的操做系統上運行(Unix、Windows、 Mac) 。PyQt 有兩種許可,開發者能夠在 GPL 和商業許可證之間作出選擇。以前,PyQt 的 GPL 許可證只在 Unix 系統上可用,但在 PyQt4 以後,其 GPL 許可證適用於全部支持它的 系統。 由於 PyQt 有大量的類,爲便於管理,它們被劃分到以下的幾個模塊中。
QtGui QtNetWork
QtCore QtXml
QtOpenGL QtSql
QtSvg
其中 QtCore 模塊包含了核心的非 GUI 功能函數,用於如下方面:日期、文件和目錄、 數據結構、數據流、URL、MIME、線程和進程。QtGui 模塊則包含了繪圖組件以及與繪圖 相關的類,好比按鈕、窗口、狀態欄、工具欄、滑塊、位圖、顏色、字體等。QtNetWork 模 塊包含用於網絡編程的類, 用戶能夠用這些類實現 TCP/IP 和 UDP 的客戶端或服務器。 而且 使用這些類會使網絡編程更加容易、輕便。QtXml 包含用於處理 XML 文件的類,該模塊提 供了 SAX 和 DOM API 兩種 XML 文件處理方式的實現。QtSvg 模塊包含了用於顯示 SVG (可縮放矢量圖形,參考 http://zh.wikipedia.org/wiki/SVG)文件內容的類。QtOpenGL 模塊 用於渲染使用 OpenGL 庫建立的 3D 或 2D 圖形。 而且它支持 Qt GUI 庫和 OpenGL 庫的無縫 結合。QtSql 則庫提供了用於操做數據庫的類。 1.2 使用 PyQt4 建立入門程序 在本章的 PyQt4 指南中咱們將學習一些基本的功能。咱們講解的速度會很慢,就像是 在和一個孩子說話同樣。對於一個孩子來講,他邁出的第一步是笨拙遲緩的。一樣,對於一 個編程新手來講,他接受新事物的過程也會比較的遲緩。但請謹記,沒有愚蠢的人,只有懶 人和人,而且懶人和人之間能夠相互轉換。 一個簡單的示例 下面的示例代碼很是簡單,它只顯示一個小窗口。然而,咱們能夠對窗口進行的操做卻 有不少,好比咱們能夠修改它的大小、最大化、最小化等。而這些操做卻須要大量的代碼, 因爲這些操做在不少程序中都須要用到, 因此前人已經寫好了這些操做的代碼。 咱們沒有必 要一遍一遍的從新編寫這些代碼,所以這些代碼對程序員來講是隱藏的。PyQt 是一個高度
2
抽象的工具包,所以,若是咱們使用較底層的工具包來實現相同的功能,下面的示例代碼就 會增加不少。 #!/usr/bin/python # simple.py import sys from PyQt4 import QtGui app = QtGui.QApplication(sys.argv) widget = QtGui.QWidget() widget.resize(250, 150) widget.setWindowTitle('simple') widget.show() sys.exit(app.exec_()) ----------------------------------------------------------------------------------------------------------------import sys from PyQt4 import QtGui 這兩句用來載入必須的模塊。基本的 GUI 窗口部件在 QtGui 模塊中。 app = QtGui.QApplication(sys.argv) 每個 PyQt4 程序都須要有一個 application 對象,application 類包含在 QtGui 模塊中。 sys.argv 參數是一個命令行參數列表。 Python 腳本能夠從 shell 中執行, 參數可讓咱們選擇 啓動腳本的方式。 widget = QtGui.QWidget() QWidget 部件是 PyQt4 中全部用戶界面類的父類。 這裏咱們使用沒有參數的默認構造函 數,它沒有繼承其它類。咱們稱沒有父類的 widget 爲一個 window。
widget.resize(250, 150)
resize()方法能夠改變窗口部件的大小, 在這裏咱們將其設置爲 250 像素寬, 像素高。 150
widget.setWindowTitle('simple')
這句用來設置窗口部件的標題,該標題將在標題欄中顯示。
widget.show()
show()方法將窗口部件顯示在屏幕上。
sys.exit(app.exec_())
最後咱們進入該程序的主循環。 事件處理從本行語句開始。 主循環接受事件消息並將其 分發給程序的各個部件。若是調用 exit()或主部件被銷燬,主循環就會結束。使用 sys.exit() 方法退出能夠確保程序能夠完整的結束, 這種狀況下系統的環境變量會記錄程序是如何退出 的。 也許你會疑惑, 爲何 exec_()方法會有一個下劃線。 這是由於 exec 是 Python 的關鍵字, 爲避免衝突,PyQt 使用 exec_()替代。
3
截圖:simple
1.3 程序圖標
程序圖標就是一個小圖片,一般顯示在程序標題欄的左上角。在如下的示例中,咱們將 學習如何在 PyQt 中使用程序圖標,另外咱們還將學習一些新的方法。 #!/usr/bin/python # icon.py import sys from PyQt4 import QtGui class Icon(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('icons/web.png')) app = QtGui.QApplication(sys.argv) icon = Icon() icon.show() sys.exit(app.exec_()) ----------------------------------------------------------------------------------------------------------------上一個示例採用了面向過程的方法編寫。 Python 語言同時支持面向過程和麪向對象兩 種編程方法。PyQt 編程是面向對象的。 class Icon(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) 面向對象編程中最重要的是類、屬性和方法。以上代碼中,咱們建立了一個名爲 Icon 的新類,該類繼承 QtGui.QWidget 類。所以咱們必須調用兩個構造函數——Icon 的構造函數
4
和繼承類 QtGui.QWidget 類的構造函數。 self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('icons/web.png')) setGeometry()方法完成兩個功能——設置窗口在屏幕上的位置和設置窗口自己的大小。 它的前兩個參數是窗口在屏幕上的 x 和 y 座標。後兩個參數是窗口自己的寬和高。 setWindowIcon()方法用來設置程序圖標, 它須要一個 QIcon 類型的對象做爲參數。 調用 QIcon 構造函數時,咱們須要提供要顯示的圖標的路徑(相對或絕對路徑) 。
截圖:Icon
1.4 顯示提示信息
咱們能夠爲任何窗口部件設置一個氣球提示。 #!/usr/bin/python # tooltip.py import sys from PyQt4 import QtGui from PyQt4 import QtCore class Tooltip(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Tooltip') self.setToolTip('This is a <b>QWidget</b> widget') QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
5
app = QtGui.QApplication(sys.argv) tooltip = Tooltip() tooltip.show() sys.exit(app.exec_()) ----------------------------------------------------------------------------------------------------------------在本示例中,咱們爲一個 QWidget 類型的窗口部件設置工具提示。 self.setToolTip('This is a <b>QWidget</b> widget') 要建立工具提示,則須要調用 setToolTip()方法。該方法接受富文本格式的參數。 QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10)) 由於默認的 QToolTip 字體看起來比較糟糕,咱們能夠經過上面的語句設置想要的字體 和字體大小。
截圖:tooltip 關閉窗口 一個顯而易見的關閉窗口的方式是單擊標題欄右上角的 X 標記。在接下來的示例中, 咱們將展現如何用代碼來關閉程序,並簡要介紹 Qt 的信號和槽機制。 下面是 QPushButton 的構造函數,咱們將會在下面的示例中使用它。 QPushButton(string text, QWidget parent = None) text 表示將顯示在按鈕上的文本。parent 是其對象,用於指定按鈕顯示在哪一個部件中。 在咱們的示例中,parent 爲是一個 QWidget 對象。 #!/usr/bin/python # quitbutton.py import sys from PyQt4 import QtGui, QtCore class QuitButton(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('quitbutton')
6
quit = QtGui.QPushButton('Close', self) quit.setGeometry(10, 10, 60, 35) self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()')) app = QtGui.QApplication(sys.argv) qb = QuitButton() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------quit = QtGui.QPushButton('Close', self) quit.setGeometry(10, 10, 60, 35) 以上兩句用來建立一個按鈕並將其放在 QWidget 部件上,就像咱們將 QWidget 部件放 在屏幕上同樣。 self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp,QtCore.SLOT('quit()')) PyQt4 的事件處理系統創建在信號-槽機制之上。若是咱們單擊 quit 按鈕,那麼信號 clicked()就會被觸發,槽函數能夠是 PyQt 自帶的槽函數,也能夠是任何 Python 能夠調用的 函數等。QtCore.QObject.connect()方法能夠將信號和槽函數鏈接起來。在咱們的示例中槽函 數是 PyQt 中已定義的 quit()函數。經過 connect 方法就能夠創建發送者(quit 按鈕)和接受 者(應用程序對象)之間的通訊。
截圖:quitbutton 消息窗口 默認狀況下,若是咱們單擊了窗口標題欄上的 X 標記,窗口就會被關閉。可是有些時 候咱們想要改變這一默認行爲。好比,咱們正在編輯的文件內容發生了變化,這時若單擊 X 標記關閉窗口,編輯器就應當彈出確認窗口。 #!/usr/bin/python # messagebox.py import sys from PyQt4 import QtGui
7
class MessageBox(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('message box') def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() app = QtGui.QApplication(sys.argv) qb = MessageBox() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------若是咱們關閉 QWidget 窗口, QCloseEvent 事件就會被觸發。 要改變原有的 wdiget 行爲 阻止查窗口的關閉,咱們就須要從新實現 closeEvent()方法。 reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) 經過上面的語句咱們能夠顯示一個帶有兩個按鈕(Yes/No)的消息窗口。第一個字符串 參數'Message'在消息窗口的標題欄顯示。第二個字符串參數以對話的形式顯示在消息窗口 中。返回的結果被保存在 reply 變量中。 if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() 咱們使用上面的 if 語句來判斷用戶選擇的結果。若是用戶選擇了 Yes 按鈕,那麼關閉 widget 窗口並終止應用程序的動做會被容許執行。不然,關閉窗口的動做會被忽略。
截圖:messagebox
8
將窗口放在屏幕中間 如下的腳本顯示了將窗口放在屏幕的中間位置的方法。 #!/usr/bin/python # center.py import sys from PyQt4 import QtGui class Center(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('center') self.resize(250, 150) self.center() def center(self): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
app = QtGui.QApplication(sys.argv) qb = Center() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------self.resize() 該語句用來設置 QWidget 窗口的大小爲 250 像素寬,150 像素高。 screen = QtGui.QDesktopWidget().screenGeometry() 該語句用來計算出顯示器的分辨率(screen.width , screen.height) 。 size = self.geometry() 該語句用來獲取 QWidget 窗口的大小(size.width, size.height) 。 self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) 該語句將窗口移動到屏幕的中間位置。 3.PyQt4 中的菜單和工具欄 主窗口 QMainWindow 類用來建立應用程序的主窗口。經過該類,咱們能夠建立一個包含狀態 欄、工具欄和菜單欄的經典應用程序框架。
9
狀態欄 狀態欄是用來顯示狀態信息的串口部件。 #!/usr/bin/python # statusbar.py import sys from PyQt4 import QtGui class MainWindow(QtGui.QMainWindow): def __init__(self, parent = None): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('statusbar') self.statusBar().showMessage('Ready') app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------self.statusBar().showMessage('Ready') 使用 QApplication 類的 statusBar()方法建立狀態欄。使用 showMessage()方法將信息顯 示在狀態欄中。
截圖:statusbar 菜單欄 菜單欄是 GUI 程序最明顯的組成部分。它由一組位於不一樣菜單中的命令組成。在控制 臺程序中,咱們必須記住那些晦澀難懂的命令。但在 GUI 程序中,經過菜單欄咱們將命令 合理的放置在不一樣的菜單中來下降學習新應用程序的時間開銷。 #!/usr/bin/python
10
# menubar.py import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self, parent = None): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('menubar') exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) exit.setShortcut('Ctrl+Q') exit.setStatusTip('Exit application') exit.connect(exit, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()')) self.statusBar() menubar = self.menuBar() file = menubar.addMenu('&File') file.addAction(exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------menubar = self.menuBar() file = menubar.addMenu('&File') file.addAction(exit) 首先咱們使用 QMainWindow 類的 menuBar()方法建立一個菜單欄。 而後使用 addMenu() 方法添加一個菜單。最後咱們把動做對象(這裏是 exit)添加到 file 菜單中。
11
截圖:menubar 工具欄 菜單對程序中的全部命令進行分組放置,而工具欄則提供了快速執行最經常使用命令的方 法。 #!/usr/bin/python # toolbar.py import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self, parent = None): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('toolbar') self.exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) self.exit.setShortcut('Ctrl+Q') self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()')) self.toolbar = self.addToolBar('Exit') self.toolbar.addAction(self.exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------self.exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) self.exit.setShortcut('Ctrl+Q') GUI 應用程序的行爲是由命令來控制的,這些命令能夠來自菜單、上下文菜單、工具欄 或它們的快捷方式。 PyQt 經過引入 actions 來簡化編程難度, 一個 action 對象能夠擁有菜單、 文本、圖標、快捷方式、狀態信息、 「這是什麼?」文本或工具提示等。在咱們的示例程序 中,咱們定義了一個擁有圖標、工具提示和快捷方式的 action 對象。 self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()')) 該語句將 action 對象的 triggered()信號鏈接到預約義的 quit()槽函數。 self.toolbar = self.addToolBar('Exit') 該語句建立一個工具欄, 而後使用語句 self.toolbar.addAction(self.exit)將 action 對象 (這 裏是 exit)添加到該工具欄。
12
截圖:toolbar 將它們聚合在一塊兒 在本章的最後一個示例中,咱們將建立一個菜單欄、一個工具欄和一個狀態欄。咱們還 會建立一箇中心部件。 #!/usr/bin/python # mainwindow import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self, parent = None): QtGui.QMainWindow.__init__(self) self.resize(350, 250) self.setWindowTitle('mainwindow') textEdit = QtGui.QTextEdit() self.setCentralWidget(textEdit) exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) exit.setShortcut('Ctrl+Q') exit.setStatusTip('Exit application') self.connect(exit, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()')) self.statusBar() menubar = self.menuBar() file = menubar.addMenu('&File') file.addAction(exit)
13
toolbar = self.addToolBar('Exit') toolbar.addAction(exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------在該示例中, 咱們建立了一個文本編輯部件, 並將它設置爲 QMainWindow 的中心部件。 中心部件將佔據全部的窗口剩餘空間。
截圖:mainwindow 4.PyQt4 中的佈局管理器 佈局管理器是編程中重要的一部分。 所謂佈局管理是指咱們在窗口中安排部件位置的方 法。 佈局管理有兩種工做方式: 絕對定位方式 (absolute positioning) 和佈局類別方式 (layout classes) 。 絕對定位方式 該方式下, 程序員編程指定每個部件的位置和尺寸像素。 當使用絕對定位方式時, 須要注意如下幾點: ·改變窗口大小時,窗口中部件的大小和位置不會隨之改變。 ·在不一樣的平臺上,應用程序可能會看起來不盡相同。 ·在應用程序中改變字體可能會致使佈局混亂。 ·若是你打算改變窗口布局,你就必須得從新書寫全部部件的佈局,這一工做會非 常乏味且耗時較多。 #!/usr/bin/python # absolute.py
14
import sys from PyQt4 import QtGui class Absolute(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self) self.setWindowTitle('Communication') label = QtGui.QLabel('Couldn\'t', self) label.move(15, 10) label = QtGui.QLabel('care', self) label.move(35, 40) label = QtGui.QLabel('less', self) label.move(55, 65) label = QtGui.QLabel('And', self) label.move(115, 65) label = QtGui.QLabel('then', self) label.move(135, 45) label = QtGui.QLabel('you', self) label.move(115, 25) label = QtGui.QLabel('kissed', self) label.move(145, 10) label = QtGui.QLabel('me', self) label.move(215, 10) self.resize(250, 150) app = QtGui.QApplication(sys.argv) qb = Absolute() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------在該示例中,咱們簡單是使用 move()方法來設置部件的位置。咱們經過 x 和 y 坐 標來指定 QLabel 部件的位置,座標起點爲左上角的頂點。x 座標從左向右增加,y 座標 從上向下增加。
15
截圖:absolute positioning Box 佈局 使用佈局類別方式的佈局管理器比絕對定位方式的佈局管理器更加靈活實用。 它是 窗口部件的首先佈局管理方式。最基本的佈局類別是 QHBoxLayout 和 QVBoxLayout 佈局管理方式,分別將窗口部件水平和垂直排列。 假設咱們要將兩個按鈕放在窗口的右下角。 爲建立該佈局, 咱們須要使用一個水平 Box 和一個垂直 Box,另外爲了建立必須的空白空間,咱們還須要添加一個伸縮間隔元 素(stretch factor) 。 #!/usr/bin/python # boxlayout.py import sys from PyQt4 import QtGui class Boxlayout(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self) self.setWindowTitle('box layout') ok = QtGui.QPushButton('OK') cancel = QtGui.QPushButton('Cancel') hbox = QtGui.QHBoxLayout() hbox.addStretch(1) hbox.addWidget(ok) hbox.addWidget(cancel) vbox = QtGui.QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.resize(300, 150) app = QtGui.QApplication(sys.argv) qb = Boxlayout() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------ok = QtGui.QPushButton('OK') cancel = QtGui.QPushButton('Cancel') 以上兩句用來建立兩個按鈕(OK 和 Cancel 按鈕) 。
16
hbox = QtGui.QHBoxLayout() hbox.addStretch(1) hbox.addWidget(ok) hbox.addWidget(cancel) 以上四句用來建立一個水平 box 佈局,而後加入一個伸縮間隔元素與兩個按鈕。 vbox = QtGui.QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) 爲建立須要的佈局, 咱們使用以上語句建立了一個垂直 box 佈局並將水平 box 佈局 放入水平 box 佈局中。 self.setLayout(vbox) 最後咱們設置窗口的主佈局。
截圖:box layout 網格佈局 最通用的佈局類別是網格佈局(QGridLayout) 。該佈局方式將窗口空間劃分爲許多行和 列。要建立該佈局方式,咱們須要使用 QGridLayout 類。 #!/usr/bin/python # gridlayout.py import sys from PyQt4 import QtGui class GridLayout(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self) self.setWindowTitle('grid layout') names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+']
17
grid = QtGui.QGridLayout() j=0 pos = [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)] for i in names: button = QtGui.QPushButton(i) if j == 2: grid.addWidget(QtGui.QLabel(''), 0, 2) else: grid.addWidget(button, pos[j][0], pos[j][1]) j=j+1 self.setLayout(grid) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.show() sys.exit(app.exec_()) ---------------------------------------------------------------------------------------------------------------在這個示例中,咱們建立一組按網格佈局的按鈕。爲了填補 Bck 和 Close 按鈕之間的空 白,咱們使用 QLabel 部件。 grid = QtGui.QGridLayout() 該語句建立了一個網格佈局。 if j == 2: grid.addWidget(QtGui.QLabel(''), 0, 2) else: grid.addWidget(button, pos[j][0], pos[j][1]) 使用 addWidget()方法,咱們將部件加入到網格佈局中。addWidget()方法的參數依次爲 要加入到局部的部件,行號和列號。
截圖:grid layout
18
部件在網格佈局中能夠跨越多行或多列。咱們將下面的示例中演示該狀況。 #!/usr/bin/python # gridlayout2.py import sys from PyQt4 import QtGui class GridLayout(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self) self.setWindowTitle('grid layout') title = QtGui.QLabel('Title') authot = QtGui.QLabel('Author') review = QtGui.QLabel('Review') titleEdit = QtGui.QLineEdit() authorEdit = QtGui.QLineEdit() reviewEdit = QtGui.QLineEdit() grid = QtGui.QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(authot, 2, 0) gridpython