Hello World,本章學習Qt的基本功能


Hello World

本章學習Qt的基本功能

例1,簡單的窗口

這個簡單的小例子展示的是一個小窗口。但是我們可以在這個小窗口上面做很多事情,改變大小,最大化,最小化等,這需要很多代碼才能實現。這在很多應用中很常見,沒必要每次都要重寫這部分代碼,Qt已經提供了這些功能。PyQt5是一個高級的工具集合,相比使用低級的工具,能省略上百行代碼。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

In this example, we create a simple
window in PyQt5.

author: Jan Bodnar
website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    sys.exit(app.exec_())
View Code

 

運行上面的代碼,能展示出一個小窗口。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

 

這里引入了PyQt5.QtWidgets模塊,這個模塊包含了基本的組件。

app = QApplication(sys.argv)

 

每個PyQt5應用都必須創建一個應用對象。sys.argv是一組命令行參數的列表。Python可以在shell里運行,這個參數提供對腳本控制的功能。

w = QWidget()

 

QWidge控件是一個用戶界面的基本控件,它提供了基本的應用構造器。默認情況下,構造器是沒有父級的,沒有父級的構造器被稱為窗口(window)。

w.resize(250, 150)

 

resize()方法能改變控件的大小,這里的意思是窗口寬250px,高150px。

w.move(300, 300)

 

move()是修改控件位置的的方法。它把控件放置到屏幕坐標的(300, 300)的位置。注:屏幕坐標系的原點是屏幕的左上角。

w.setWindowTitle('Simple')

 

我們給這個窗口添加了一個標題,標題在標題欄展示(雖然這看起來是一句廢話,但是后面還有各種欄,還是要注意一下,多了就蒙了)。

w.show()

 

show()能讓控件在桌面上顯示出來。控件在內存里創建,之后才能在顯示器上顯示出來。

sys.exit(app.exec_())

 

最后,我們進入了應用的主循環中,事件處理器這個時候開始工作。主循環從窗口上接收事件,並把事件傳入到派發到應用控件里。當調用exit()方法或直接銷毀主控件時,主循環就會結束。sys.exit()方法能確保主循環安全退出。外部環境能通知主控件怎么結束。

exec_()之所以有個下划線,是因為exec是一個Python的關鍵字。

程序預覽:

simple

例2,帶窗口圖標

窗口圖標通常是顯示在窗口的左上角,標題欄的最左邊。下面的例子就是怎么用PyQt5創建一個這樣的窗口。

在某些環境下,圖標顯示不出來。如果你遇到了這個問題,看我在Stackoverfolw的回答

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This example shows an icon
in the titlebar of the window.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))        

        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
View Code

 

前一個例子是使用的過程式編程。Python還支持面向對象的編程:

class Example(QWidget):

    def __init__(self):
        super().__init__()
        ...

 

面向對象編程最重要的三個部分是類(class)、數據和方法。我們創建了一個類的調用,這個類繼承自QWidget。這就意味着,我們調用了兩個構造器,一個是這個類本身的,一個是這個類繼承的。super()構造器方法返回父級的對象。__init__()方法是構造器的一個方法。

self.initUI()

 

使用initUI()方法創建一個GUI。

# 自己准備一個web.png
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))

 

上面的三個方法都繼承自QWidget類。setGeometry()有兩個作用:把窗口放到屏幕上並且設置窗口大小。參數分別代表屏幕坐標的x、y和窗口大小的寬、高。也就是說這個方法是resize()move()的合體。最后一個方法是添加了圖標。先創建一個QIcon對象,然后接受一個路徑作為參數顯示圖標。

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

應用和示例的對象創立,主循環開始。

程序預覽:

icon

例3,提示框

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This example shows a tooltip on 
a window and a button.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, 
    QPushButton, QApplication)
from PyQt5.QtGui import QFont    


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        QToolTip.setFont(QFont('SansSerif', 10))

        self.setToolTip('This is a <b>QWidget</b> widget')

        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)       

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')    
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
View Code

 

在這個例子中,我們為應用創建了一個提示框。

QToolTip.setFont(QFont('SansSerif', 10))

 

這個靜態方法設置了提示框的字體,我們使用了10px的SansSerif字體。

self.setToolTip('This is a <b>QWidget</b> widget')

 

調用setTooltip()創建提示框可以使用富文本格式的內容。

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

 

創建一個按鈕,並且為按鈕添加了一個提示框。

btn.resize(btn.sizeHint())
btn.move(50, 50)

 

調整按鈕大小,並讓按鈕在屏幕上顯示出來,sizeHint()方法提供了一個默認的按鈕大小。

程序預覽:

tooltip

例4,關閉窗口

關閉一個窗口最直觀的方式就是點擊標題欄的那個叉,這個例子里,我們展示的是如何用程序關閉一個窗口。這里我們將接觸到一點single和slots的知識。

本例使用的是QPushButton組件類。

QPushButton(string text, QWidget parent = None)

 

text參數是想要顯示的按鈕名稱,parent參數是放在按鈕上的組件,在我們的 例子里,這個參數是QWidget。應用中的組件都是一層一層(繼承而來的?)的,在這個層里,大部分的組件都有自己的父級,沒有父級的組件,是頂級的窗口。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a quit
button. When we press the button,
the application terminates. 

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)       

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
View Code

 

這里創建了一個點擊之后就退出窗口的按鈕。

from PyQt5.QtCore import QCoreApplication

 

程序需要QtCore對象。

qbtn = QPushButton('Quit', self)

 

創建一個繼承自QPushButton的按鈕。第一個參數是按鈕的文本,第二個參數是按鈕的父級組件,這個例子中,父級組件就是我們創建的繼承自QwidgetExample類。

qbtn.clicked.connect(QCoreApplication.instance().quit)

 

事件傳遞系統在PyQt5內建的single和slot機制里面。點擊按鈕之后,信號會被捕捉並給出既定的反應。QCoreApplication包含了事件的主循環,它能添加和刪除所有的事件,instance()創建了一個它的實例。QCoreApplication是在QApplication里創建的。 點擊事件和能終止進程並退出應用的quit函數綁定在了一起。在發送者和接受者之間建立了通訊,發送者就是按鈕,接受者就是應用對象。

程序預覽:

quitbutton

例5,消息盒子

默認情況下,我們點擊標題欄的×按鈕,QWidget就會關閉。但是有時候,我們修改默認行為。比如,如果我們打開的是一個文本編輯器,並且做了一些修改,我們就會想在關閉按鈕的時候讓用戶進一步確認操作。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 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: August 2017
"""

import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        self.setGeometry(300, 300, 250, 150)        
        self.setWindowTitle('Message box')    
        self.show()


    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes | 
            QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()        


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
View Code

 

如果關閉QWidget,就會產生一個QCloseEvent,並且把它傳入到closeEvent函數的event參數中。改變控件的默認行為,就是替換掉默認的事件處理。

reply = QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)

 

我們創建了一個消息框,上面有倆按鈕:Yes和No.第一個字符串顯示在消息框的標題欄,第二個字符串顯示在對話框,第三個參數是消息框的倆按鈕,最后一個參數是默認按鈕,這個按鈕是默認選中的。返回值在變量reply里。

if reply == QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

 

這里判斷返回值,如果點擊的是Yes按鈕,我們就關閉組件和應用,否者就忽略關閉事件。

程序預覽:

messagebox

例6,窗口居中

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program centers a window 
on the screen. 

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        self.resize(250, 150)
        self.center()

        self.setWindowTitle('Center')    
        self.show()


    def center(self):

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
View Code

 

QtGui.QDesktopWidget提供了用戶的桌面信息,包括屏幕的大小。

self.center()

 

這個方法是調用我們下面寫的,實現對話框居中的方法。

qr = self.frameGeometry()

 

獲得主窗口所在的框架。

cp = QDesktopWidget().availableGeometry().center()

 

獲取顯示器的分辨率,然后得到屏幕中間點的位置。

qr.moveCenter(cp)

 

然后把主窗口框架的中心點放置到屏幕的中心位置。

self.move(qr.topLeft())

 

然后通過move函數把主窗口的左上角移動到其框架的左上角,這樣就把窗口居中了。

程序預覽:

center


免責聲明!

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



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