[Python][PyQt4]第一個 PyQt4 的程序
第一個 PyQt4 的程序¶
本部分我們將學(xué)到一些基本的功能。
簡單的例子¶
這里的代碼非常簡單。它僅僅顯示一個小小的窗口。然后我們可以對這個窗口做很多事情。我們可以調(diào)正其大小,最大化,最小化。這個需要很多的代碼。但某些人已經(jīng)編寫了這樣的功能。因?yàn)樵诤芏鄳?yīng)用中重復(fù)出現(xiàn)了這樣的代碼,沒有必要一再編寫這樣的代碼。所以,對于程序員這樣的代碼就被隱藏了。PyQt4 是一個高層的工具。如果以更底層的開發(fā),下面的例子可以要寫上很多行。
#!/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
這里我們提供一些必要的導(dǎo)入。最基本的 GUI widget 都在 QtGui 模塊中。
app = QtGui.QApplication(sys.argv)
每個 PyQt4 應(yīng)用必須創(chuàng)建一個 application 對象。此 application 對象處于 QtGui 模塊中。參數(shù) sys.argv 是從命令行獲取的參數(shù)列表。Python 腳本可以從 shell 中運(yùn)行。這是一種控制啟動我們腳本的方式。
w = QtGui.QWidget()
在 PyQt4 中, QtGui.QWidget 是所有用戶接口對象的基類。我們提供了 QtGui.QWidget 的默認(rèn)構(gòu)造函數(shù)。默認(rèn)的構(gòu)造函數(shù)沒有父類。一個沒有父類的 widget 稱為一個窗口。
w.resize(250, 150)
resize() 方法調(diào)正了 widget 的大小。它寬 250px ,高 150px 。
w.move(300, 300)
move() 方法把 widget 移到屏幕坐標(biāo)為 x = 300, y = 300 的地方。
w.setWindowTitle('Simple')
這里,我們設(shè)置了窗口的標(biāo)題。標(biāo)題在標(biāo)題欄中顯示。
w.show()
show() 方法把這個 widget 顯示到屏幕上。一個 widget 最先在內(nèi)存中創(chuàng)建,然后顯示于屏幕上。
sys.exit(app.exec())
最后,我們進(jìn)入程序的主循環(huán)。事件的處理就從此時開始。主循環(huán)接受從窗口系統(tǒng)發(fā)送的事例,并把它們發(fā)給應(yīng)用的 widget 。如果我們調(diào)用了 exit() 或者主窗口被銷毀,主循環(huán)就終止了。 sys.exit() 方法確保完全退出。整個環(huán)境將被通知應(yīng)用如何終止。
exec_() 方法有一個下劃線。這是由于 exec 是 Python 中的關(guān)鍵字。因此使用了 exec_() 。
一個應(yīng)用的圖標(biāo)¶
應(yīng)用的圖標(biāo)就是一塊小的圖像,顯示于標(biāo)題欄的左上角。下面的例子講說明在 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 支持過程式和面向?qū)ο笫降木幊?。?PyQt4 中編程就意味著以 OOP 編程。
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
在面向?qū)ο缶幊讨腥齻€最重要的東西是類,數(shù)據(jù)及方法。這里,我們創(chuàng)建了一個新的類稱為 Example 。這個類從 QtGui.QWidget 派生。這就意味著我們必須調(diào)用兩個構(gòu)造器。第一個是 Example 這個類,第二個是被繼承的類。 super() 方法就返回了 Example 的父對象,然后我們調(diào)用了其構(gòu)造器。在 Python 中 __init__() 是構(gòu)造器。
self.initUI()
GUI 的創(chuàng)建就委托給了 initUI() 這個方法。
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('web.png'))
這三個方法都是從類 QtGui.QWidget 中繼承下來的。 setGeometry() 做了兩件事情。首先是定位,然后是設(shè)置窗口大小。 前兩個參數(shù)是窗口的 x 和 y 。第三個參數(shù)是寬度,第四個是高度。事實(shí)上,它結(jié)合了 resize() 和 move() 。最后一個方法設(shè)置了應(yīng)用的圖標(biāo)。為此,我們創(chuàng)建了 QtGui.QIcon 對象。 QtGui.QIcon 接受要顯示圖標(biāo)的路徑。
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
啟動代碼放在了 main() 方法中。這是 Python 的慣用方式。
顯示提示¶
我們可以給任何一個 widget 提供 balloon 式的提示。
#!/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()
在這個例子中,我們給 widget 都設(shè)置了 tooltip 。
QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
這個靜態(tài)方法設(shè)置了 tooltip 的字體。我們使用 10px 的 SansSerif 字體。
self.setToolTip('This is a <b>QWidget</b> widget')
為了創(chuàng)建 tooltip, 我們調(diào)用了 setTooltip() 方法。我們可以使用富文本格式(rich text formatting)。
btn = QtGui.QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
我們創(chuàng)建了一個按鈕并為它設(shè)置了 tooltip 。
btn.resize(btn.sizeHint())
btn.move(50, 50)
這個按鈕被重新設(shè)置大小并移到窗口相應(yīng)的位置。 sizeHint() 方法給出一個推薦的大小。
關(guān)閉窗口¶
關(guān)閉窗口最直觀的方式就是點(diǎn)擊標(biāo)題欄上的 x 。在后面的例子中,我們將會展示如何編程來關(guān)閉窗口。我們將會簡單的接觸信號(signal)和槽(slot)。
下面是 QtGui.QPushButton 的構(gòu)造器,我們將在例子中用到。
QPushButton(string text, QWidget parent = None)
參數(shù)中的 text 是將在按鈕中顯示的文字。而 parent 則是將要放置我們按鈕的 widget 。在我們這個情況下則是 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()
在這個例子中,我們創(chuàng)建了一個退出按鈕。按了這個后,應(yīng)用就將結(jié)束。
from PyQt4 import QtGui, QtCore
在這個例子中,我們用到了 QtCore 模塊中的一個對象。
qbtn = QtGui.QPushButton('Quit', self)
我們創(chuàng)建了一個按鈕。這個按鈕是 QtGui.QPushButton 的實(shí)例。第一個參數(shù)是按鈕的標(biāo)簽。第二個是父 widget 。此處的父 widget 是 Example 這個 widget。
qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
在 PyQt4 中,事件系統(tǒng)(event processing system)建立于信號和槽機(jī)制。如果我們點(diǎn)擊了一個按鈕,點(diǎn)擊的信號就被發(fā)送了。槽可以是 Qt 的槽或者任何 Python 可調(diào)用的。 QtCore.QCoreApplication 包含了事件的主循環(huán)。它處理所有的事件。 instance() 方法給我們它當(dāng)前的實(shí)例。注意, QtCore.QCoreApplication 是和 QtGui.QApplication 一起創(chuàng)建的。點(diǎn)擊的信號則和終止應(yīng)用的 quit() 方法連接了起來。通信是在兩個對象間完成。一個是發(fā)送者,也就是按鈕,另一個是接受者,就是應(yīng)用對象。
消息框¶
默認(rèn)情況下,如果我們點(diǎn)擊了關(guān)閉按鈕, QtGui.QWidget 就被關(guān)閉了。有些時候我們需要修改默認(rèn)的行為。例如,如果在編輯器中我們對某文件進(jìn)行了修改。那么我們退出時就要彈出消息框進(jìn)行確認(rèn)。
#!/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()
如果我們關(guān)閉 QtGui.QWidget ,就會產(chǎn)生 QtGui.QCloseEvent 。為了修改 widget 的行為,我們需要重新實(shí)現(xiàn) closeEvent() 。
reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No, QtGui.QMessageBox.No)
我們的消息框中有兩個按鈕, Yes 和 No 。第一個字符串顯示在標(biāo)題欄上。第二個則是對話框中的消息。第三個參數(shù)指定了要顯示的按鈕。最后的則是默認(rèn)的按鈕。焦點(diǎn)是默認(rèn)在這個按鈕上。返回值存在 reply 變量中。
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
這里,我們可以測試返回值。如果我們點(diǎn)擊了 Yes 按鈕,我們接受了關(guān)閉應(yīng)用的事件。否則,忽略這個事件。
居中窗口¶
下面的腳本將會演示如何把窗口在屏幕中居中。
#!/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()
將會把窗口居中。
self.center()
把窗口居中的代碼放在了自定制的 center() 方法中。
qr = self.frameGeometry()
我們得到一個指定主窗口幾何的矩形。這個包含任何窗口框架。
cp = QtGui.QDesktopWidget().availableGeometry().center()
我們計(jì)算出顯示器的分辨率,并且從分辨率中得到了中間點(diǎn)。
qr.moveCenter(cp)
我們的矩形已經(jīng)有其寬度和高度了?,F(xiàn)在,我們把矩形的中心移到屏幕的中心。矩形的大小并未改變。
self.move(qr.topLeft())
我們應(yīng)用窗口的左上角移到 qr 的左上角,這樣就完成了居中。
在本部分,我們涉及一些基本的知識。
posted on 2012-02-05 10:00 mirguest 閱讀(5720) 評論(4) 編輯 收藏 引用 所屬分類: Python
評論
只有注冊用戶登錄后才能發(fā)表評論。 | ||
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
![]() |
||
相關(guān)文章:
|
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|