PyQt4入門學習筆記(一)


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的高分辨率幾乎讓我看不到原來的標題,但樣式大致不會變)

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM