天天看點

PyQt邊學邊用:三,從顯示一個視窗開始PyQt邊學邊用:三,從顯示一個視窗開始

PyQt邊學邊用:三,從顯示一個視窗開始

寫在前面

開始的時候我本來是想先詳細的介紹一下PyQt的各個部分以及功能,後來想想還是算了。一是我也不老了解的,要介紹的話我還要自己先去查一查;二是怕一下子講太多文檔類介紹的東西也記不住。幹脆就從小例子開始用到什麼說什麼吧。

如何建立一個視窗

打開一個python檔案,如何建立一個視窗呢?最簡單的方法,直接執行個體化一個PyQt視窗類試試呢?

from PyQt5.QtWidgets import QMainWindow
w = QMainWindow()
w.show()
           

運作一下,顯然是不行的,提示:

QWidget: Must construct a QApplication before a QWidget

要在建立QWidget之前先建立一個QApplication,QApplication是什麼呢?我們不妨看一看官網。

QApplication Class

QApplication管理GUI程式的控制流和主要設定。QApplication包含由視窗系統和其他來源處理過和發送過的主事件循環。它也處理應用程式的初始化和收尾工作,并提供對話管理。QApplication可以對系統和應用的大部分設定項進行設定。

我們引入QApplication子產品并建立執行個體。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
app = QApplication(sys.argv)
w = QMainWindow()
w.show()
sys.exit(app.exec())
           

再次運作,就可以看到一個視窗顯示了出來。

PyQt邊學邊用:三,從顯示一個視窗開始PyQt邊學邊用:三,從顯示一個視窗開始

上面代碼中:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
           

引入必要子產品。

app = QApplication(sys.argv)
w = QMainWindow()
           

建立QApplication、QMainWindow執行個體。我們直接對PyQt提供的視窗類進行執行個體化。

顯示建立的視窗。

這裡是關鍵了,這句是為了進入程式主循環,開始視窗的事件處理。如果調用了exit()方法或者視窗銷毀,主循環退出。sys.exit()方法確定一個不留垃圾的退出。系統環境将會被通知應用是怎樣被結束的。

使用.ui檔案建立視窗

PyQt除了可以使用視窗類建立視窗并添加元件之外還可以使用Qt Designer設計好界面後直接載入的程式。載入

打開Qt Designer,建立一個Widget視窗,類名設定為”PyQt“,視窗标題改為“PyQt視窗”并儲存,就生成了一個.ui檔案。載入.ui檔案有兩種方式,一種是使用loadUi方法直接加載.ui檔案,這種方式的好處在于修改ui後不需要修改程式就可以加載新設計的ui。還有一種方法是将.ui檔案編譯成.py檔案使用import方式導入到程式。

PyQt邊學邊用:三,從顯示一個視窗開始PyQt邊學邊用:三,從顯示一個視窗開始

直接加載.ui檔案

建立一個.py檔案,并輸入如下内容。

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.uic import loadUi
class WIDGET(QWidget): 
    def __init__(self, parent=None): 
        super(QWidget, self).__init__(parent) 
        loadUi('ex1.ui', self)
app = QApplication(sys.argv)
w = WIDGET()
w.show()
sys.exit(app.exec())
           

運作後顯示視窗:

PyQt邊學邊用:三,從顯示一個視窗開始PyQt邊學邊用:三,從顯示一個視窗開始

這種方式是重構widget類并加載.ui檔案。

轉換成.py檔案加載

将終端定位到檔案夾,輸入指令:

pyuic5 ex1.ui -o ui_ex1.py
           

運作成功生成ui_ex3.py檔案,我們可以打開看一下内容:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ex1.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_PyQt(object):
    def setupUi(self, PyQt):
        PyQt.setObjectName("PyQt")
        PyQt.resize(400, 300)

        self.retranslateUi(PyQt)
        QtCore.QMetaObject.connectSlotsByName(PyQt)

    def retranslateUi(self, PyQt):
        _translate = QtCore.QCoreApplication.translate
        PyQt.setWindowTitle(_translate("PyQt", "PyQt視窗"))
           

我們可以看到檔案内容主要是一個class。類名和我在Qt Designer中設定的類名有關,為“Ui_<類名>”。該類繼承object父類。

此時我們另建一個python檔案,載入上面的.py檔案:

import sys
from ui_ex3 import Ui_PyQt
from PyQt5.QtWidgets import QWidget,QApplication
class WIDGET(QWidget): 
    def __init__(self, parent=None): 
        super(QWidget, self).__init__(parent) 
        self.ui = Ui_PyQt()
        self.ui.setupUi(self)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = WIDGET()
    w.show()
    sys.exit(app.exec())
           

運作程式,上面的視窗又顯示了出來。

此處我還使用了一個判斷:

這句可以判斷出檔案是單獨運作還是被調用,如果單獨執行就運作後面語句,如果被調用就不運作。這句非常适用于子產品調試代碼。