一直沒有找到什麼好的pyqt4的教程,偶然在google上搜到一篇不錯的入門文檔,翻譯過來,留之後再複習。python
原始連接以下:web
http://zetcode.com/gui/pyqt4/firstprograms/shell
在這篇PyQt4的入門文檔,咱們講學習一些基礎功能。編程
這是一個顯示一個小窗口的簡單例子。咱們能夠對這個窗口作一些操做。咱們能夠改變它的大小,最大化它,或者最小化它。這須要大量的編碼。有人已經寫好了這些基礎函數,由於它在絕大部分應用中重複出現,不須要重複的去編碼。PyQt4是一個高級的工具包。若是咱們在一個低級的工具包裏編碼,下面這個例子可能輕鬆過百行。app
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we create a simple window in PyQt4. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui def main(): app = QtGui.QApplication(sys.argv) w = QtGui.QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
上面這段代碼運行後將在屏幕上顯示一個小窗口。編輯器
import sys from PyQt4 import QtGui
咱們在這裏提供必要的import,基礎的GUI窗口部件在QtGui
模塊裏。函數
app = QtGui.QApplication(sys.argv)
每個PyQt4的應用必須建立一個Application
對象。參數sys.argv
是一個來自命令行的參數列表。python腳本能夠從shell腳本里運行。這是一種咱們能夠控制咱們腳本啓動的方式。工具
w = QtGui.QWidget()
QtGui.Qwidgt
部件是一個是pyqt4裏全部用戶接口對象中的基類。咱們用默認的QtGui.Qwidgt
構造器(constructor)。默認的構造器沒有父類,一個不帶父類的窗口部件在窗口被調用。學習
w.resize(250, 150)
這個resize()
方法改變窗口大小。上述語句把窗口改爲了250px寬,150px高。測試
w.move(300, 300)
這個move()
方法移動窗口到屏幕上座標爲x,y=(300,300)的位置
w.setWindowTitle('Simple')
上述語句使咱們爲咱們的窗口設置標題,標題會被顯示在標題欄(titlebar)
w.show()
這個show()方法把窗口部件顯示在屏幕上。一個窗口是先在內存中建立,而後再在屏幕上顯示。
sys.exit(app.exec_())
最終,咱們結束了應用的主循環。主循環是從窗口系統中接收事件並快速的發往應用窗口。當咱們調用exit()
方法或者關閉主窗口時,主循環結束。這個sys.exit()
方法是確保一個乾淨的關閉。
這個exec_()
方法有個下劃線,由於exec
是python的一個關鍵字,因此用exec_
替代了。
若是你按照上面的代碼運行,那麼應該會獲得相似下面這樣的狀態(我本身修改了窗口的大小,由於surfacebook的高分辨率幾乎讓我看不到原來的標題,但樣式大體不會變)
應用圖標(application icon)是一個被用來顯示在標題欄頂部左側角落的小圖片。在下面這個例子中,咱們將展現如何在pyqt4裏面實現它。咱們同時也會介紹一些新方法。
#!/usr/bin/python
# -- coding: utf-8 --
""" ZetCode PyQt4 tutorial This example shows an icon in the titlebar of the window. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('web.png')) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
咱們前一個例子是用面向過程的風格編程。python是一門既支持面向過程又支持面向對象的語言。在pyqt4內編程,意味着OOP(面向對象)。
class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() ...
面向對象中三個最重要的事是類(class),數據(data),和方法(method)。在這裏咱們建立了一個叫作Example
的新類。這個Example
類是繼承於QtGui.QWidget
,這意味着咱們能夠調用兩個構造器,第一個是對Example
類,另外一個是對被繼承的類。
super()
方法返回Example
類的父類對象。__init__()
方法是python的一個構造器方法。
self.initUI()
GUI的建立是被委託給initUI()
方法。
self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('web.png'))
這三個方法都是從QtGui.QWidget
類繼承過來。
setGeometry()
方法作兩個事。它定位了窗口在屏幕的位置而且設定窗口大小。前兩個參數是窗口的x,y座標。第三個參數是窗口寬度,第四個是窗口高度。事實上,它結合了resize()
和move()
方法。最後一個方法設定了應用的圖標。爲了作到這個,咱們建立了一個QtGui.QIcon
類型的對象。QtGui.QIcon
接受一個圖片的路徑(就是你想用來作圖標的圖片)
def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
啓動代碼被放在一個main()
方法內(我想這叫函數更好?)。這是一個python 的習慣用法。
運行後相似下圖
咱們能夠給咱們的任何一個部件提供一個氣泡提示。
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This example shows a tooltip on a window and a button author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QtGui.QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Tooltips') self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
在這個例子裏,咱們爲兩個pyqt4部件顯示了一個提示工具。
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
這個基礎的方法設定一個被用來渲染提示工具的字體。咱們用了一個10px的SansSerif字體。
self.setToolTip('This is a <b>QWidget</b> widget')
爲了建立一個提示工具,咱們調用setTooltip()
方法。咱們同時可使用富文本。
btn = QtGui.QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
咱們建立了一個按鈕(button),而且爲其設定一個提示工具。
btn.resize(btn.sizeHint()) btn.move(50, 50)
這個按鈕在窗口上被改變大小而且被移動。這個sizeHint()
方法提供了一個按鈕的推薦尺寸。
運行上面的程序後,效果相似下圖
咱們以前關閉窗口的方法是點擊標題欄的"x"。在下一個例子裏,咱們將會展現咱們能夠程序化的關閉咱們的窗口。咱們將會稍稍的接觸一下信號(signal)和槽(slot)。
下面是一個咱們將會用在咱們例子中的QtGui.QPushButton
的構造器。
QPushButton(string text, QWidget parent = None)
text
參數是一個被用來展現在按鈕上的字符串。parent
是一個咱們按鈕的父類部件,在咱們的例子裏,它將會是QtGui.QWidget
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This program creates a quit button. When we press the button, the application terminates. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): qbtn = QtGui.QPushButton('Quit', self) qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Quit button') self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
在這個例子裏,咱們建立了一個離開按鈕。點擊按鈕,應用將會被終止
運行後效果相似下圖
默認的,若是咱們點擊了標題欄的"X",QtGui.QWidget
將會被關閉。有些時候咱們想要修改這個默認的行爲。舉個例子,若是咱們有一個文件在一個編輯器內被打開,而且作了些修改,退出時咱們會顯示一個消息盒子讓人肯定這個動做。
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This program shows a confirmation message box when we click on the close button of the application window. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
若是咱們關閉QtGui.QWidget
,QtGui.QCloseEvent
將會被觸發。爲了修改部件行爲咱們須要從新實現closeEvent
事件handler。
reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
咱們展現了一個帶有兩個按鈕的消息盒子:yes和no,第二個字符串是對話框顯示的字符串。第三個參數具體規定了按鈕和顯示文字的組合。最後一個參數是默認的按鈕。它是一個初始化的鍵盤focus的按鈕。(就是直接enter時選擇的按鈕)。返回值被存儲在reply
變量中。
if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
咱們測試了返回值。若是點擊了yes按鈕,咱們接受一個關閉部件的時間而且關閉應用。其餘狀況咱們關閉這個事件。
運行後相似下圖:
下面的腳本顯示咱們如何在桌面屏幕上中心化一個窗口
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This program centers a window on the screen. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.resize(250, 150) self.center() self.setWindowTitle('Center') self.show() def center(self): qr = self.frameGeometry() cp = QtGui.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
QtGui.QDesktopWidget
類提供了關於用戶桌面的信息,包括屏幕尺寸
self.center()
這行代碼將會將窗口置於屏幕中心
qr = self.frameGeometry()
咱們在主窗口內獲得一個指定的長方形幾何體。
cp = QtGui.QDesktopWidget().availableGeometry().center()
咱們獲得了顯示器的中心點。
qr.moveCenter(cp)
咱們的長方形窗口已經有了寬度和高度,如今咱們設定它的中心在屏幕中心。它的大小不變。
self.move(qr.topLeft())
咱們移動應用窗口的左上點到長方形的左上角,至此咱們就將窗口移動到了中央。
在這一節pyqt4的教程中,咱們討論了一些基本的內容。
翻譯和補充的有誤的地方,歡迎在評論區指正。