PyQt4入門學習筆記(一)
一直沒有找到什么好的pyqt4的教程,偶然在google上搜到一篇不錯的入門文檔,翻譯過來,留以后再復習。
原始鏈接如下:
http://zetcode.com/gui/pyqt4/firstprograms/
在這篇PyQt4的入門文檔,我們講學習一些基礎功能。
簡單的例子
這是一個顯示一個小窗口的簡單例子。我們可以對這個窗口做一些操作。我們可以改變它的大小,最大化它,或者最小化它。這需要大量的編碼。有人已經寫好了這些基礎函數,因為它在絕大部分應用中重復出現,不需要重復的去編碼。PyQt4是一個高級的工具包。如果我們在一個低級的工具包里編碼,下面這個例子可能輕松過百行。
#!/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的教程中,我們討論了一些基本的內容。
翻譯和補充的有誤的地方,歡迎在評論區指正。
