PyQt4入門學習筆記(一)

PyQt4入門學習筆記(一)

一直沒有找到什麼好的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的高分辨率幾乎讓我看不到原來的標題,但樣式大體不會變)

image1

應用圖標

應用圖標(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 的習慣用法。

運行後相似下圖
image2

展現一個提示工具

咱們能夠給咱們的任何一個部件提供一個氣泡提示。

#!/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()方法提供了一個按鈕的推薦尺寸。

運行上面的程序後,效果相似下圖

image3

關閉窗口

咱們以前關閉窗口的方法是點擊標題欄的"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()

在這個例子裏,咱們建立了一個離開按鈕。點擊按鈕,應用將會被終止

運行後效果相似下圖

image4

消息盒子

默認的,若是咱們點擊了標題欄的"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.QWidgetQtGui.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按鈕,咱們接受一個關閉部件的時間而且關閉應用。其餘狀況咱們關閉這個事件。

運行後相似下圖:

image5

將窗口置於屏幕中間

下面的腳本顯示咱們如何在桌面屏幕上中心化一個窗口

#!/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的教程中,咱們討論了一些基本的內容。

翻譯和補充的有誤的地方,歡迎在評論區指正。

相關文章
相關標籤/搜索