圖形學pyside2學習筆記

一、一個簡單的小程序

import sys
# 從PySide2.QtWidgets中導入QApplicarion和QLabel這兩個類,一個是應用程序類,一個是標籤類。
from PySide2.QtWidgets import *

if __name__ == '__main__':
    app = QApplication(sys.argv)  # 生成一個應該程序對象,傳入了相關參數,這個參數是自己輸入的。實際上建立了一個QT程序的消息循環
    # 任何繼承了widget的組件都可以獨立成一個窗口,也可以設置他的父控件
    lable = QLabel('Hello world')  # 生成一個標籤對象,內容是hello world
    lable.show()  # 把這個標籤對象顯示出來,實際顯示的就是這個標籤,獨立成的窗口
    sys.exit(app.exec_())  # 程序結束
'''關於這個app.exec_(),exec_()這個是QtCore.QCoreApplication類中的靜態方法,
它的功能是進入到主事件循環,然後會一直等待,當你調用QCoreApplication類中的exit()方法時會返回,返回值就是exit方法返回的值。
在QCoreApplication類中還有一個quit方法,如果調用quit方法,那麼exit方法就會返回0,相當於調用exit(0)。'''

 

消息循環是應用程序的消息隊列,消息是由程序其中組件的動作來發出的,在消息隊列中排隊等待處理。具體關係下一節說

還有就是爲什麼上例中沒有消息傳遞也要先創建一個app,不創建程序就沒辦法運行,等後面明白了再來補吧

二、信號與槽

如上一節所說,消息(信號)就是由組件的動作所發出的,一個組件可能有很多個動作,每個動作觸發之後,就會發出一個信號,然後這個信號被指向的組件綁定的指定槽函數接受(也就是在建立信號與槽的關係的時候,就指定了動作發出組件(動作函數)與消息接收組件(綁定了槽函數)),由這個槽函數來處理消息。每個槽函數都與一個組件的一個或者多個動作綁定。信號可以由多個控件發送,然後由一個槽來進行接收,同樣,多個槽也可以接收同一個信號。

這個類似java中的事件處理機制,一個組件發出動作(事件)之後,就由其綁定的事件監聽器(槽函數)來處理,一個組件可以有很多個動作(點擊,長按等等),也可以有很多個監聽器。多個組件可以綁定一個事件處理函數,一個組件也可以綁定很多個事件處理函數。

信號與槽的綁定,可以用代碼來,也可以在圖形化界面中來,圖形學課程的學習中,主要用圖形化的方式設計UI和綁定函數,然後用包將ui文件轉成py文件直接引用,所以就不寫信號與槽的代碼綁定方法了,需要時再查。

import sys
# 從PySide2.QtWidgets中導入QApplicarion和QLabel這兩個類,一個是應用程序類,一個是標籤類。
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
if __name__ == '__main__':
    app = QApplication(sys.argv)
    quitButton = QPushButton('quit')
    quitButton.resize(200, 100)
    # 設定這個字的格式,其中QFont是一個字體格式類,它傳入了3個參數
    # "Times"就類似於宋體之類的選項,18就是字號大小,QtGui.QFont.Bold表示這個字加粗。
    quitButton.setFont(QFont('Times', 18, QFont.Bold))
    # QObject類中的connect方法,用來連接對象事件的傳遞,上面表示quit這個對象被點擊後,系統會調用app對象中的quit方法。
    QObject.connect(quitButton, SIGNAL('clicked()'), app, SLOT('quit()'))
    quitButton.show()
    sys.exit(app.exec_())

三、QWidget對象

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


import sys
# 從PySide2.QtWidgets中導入QApplicarion和QLabel這兩個類,一個是應用程序類,一個是標籤類。
from PySide2 import QtWidgets, QtCore, QtGui

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = QtWidgets.QWidget()
    win.setWindowTitle('第二個小程序')
    win.resize(400, 200)
    quitButton = QtWidgets.QPushButton(text='quit', parent=win)  # 位置參數記不住對應的位置的話,可以按照名字傳遞
    quitButton.setFont(QtGui.QFont('Times', 18, QtGui.QFont.Bold))
    quitButton.setGeometry(10, 40, 180, 40)  # x, y, w, h
    QtCore.QObject.connect(quitButton, QtCore.SIGNAL('clicked()'), app, QtCore.SLOT('quit()'))
    win.show()
    sys.exit(app.exec_())

'''這裏出現了一個QWidget類,這個又是什麼東西呢,查看文檔得知這個QWidget類是基礎類中的所有用戶界面對象。
這個QWidget裏面通常有其他的控件比如按鈕,標籤等一些控件。它可以從系統中接收鼠標,鍵盤等一些事件。
簡單來說,QWidget類似於一個可以放入其它控件的容器,同時,這個容器也可以被放到其它容器裏面。
每一個widget都是一個矩形,它們按照Z字型(從左到右,從上到下)進行排列。沒有父窗口的widget叫窗口,
通常窗口有一個frame和標題欄,這個是可選的,你也可以創建沒有標題欄的窗口,比如對話框。
上面程序中window就是一個窗口。
quit.setGeometry(10, 40, 180, 40)設置矩形框的大小
上面還有一個frame沒有進行解釋。當創建一個窗口後,通常裏面還要放一些子控件,把這些放哪呢,就放在frame裏面。
也就是說,win的大小是win的大小,frame的大小是frame的大小,這些都可以設置
那麼這裏有一個疑問了QApplication和QWidget有什麼區別,首先QApplication對象是不能顯示出來的,
而QWidget對象是可以顯示出來的,而且QApplication只有一個,QWidget可以有多個,QApplication相當於一個全局指針。'''

四、定義自己的widgets

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


import sys
# 從PySide2.QtWidgets中導入QApplicarion和QLabel這兩個類,一個是應用程序類,一個是標籤類。
from PySide2 import QtWidgets, QtCore, QtGui


class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(200, 100)
        self.quitButton = QtWidgets.QPushButton(text='quit', parent=self)
        self.quitButton.setGeometry(50, 20, 100, 50)
        self.quitButton.setFont(QtGui.QFont('Times', 18, QtGui.QFont.Bold))
        # self.connect(self.quitButton, QtCore.SIGNAL('clicked()'), QtWidgets.qApp, QtCore.SLOT('quit()'))
        self.connect(self.quitButton, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('close()'))
        # 繼承了QWidget,這個類就是一個最基本的組件類,如果不綁定到最根本的qApp上時,綁定到自身就要調用close,因爲quit時app專有的


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = MyWidget()
    win.show()
    sys.exit(app.exec_())

'''想要定義自己的widget,首先要繼承QWidget這個類,然後在構造方法裏面首先要調用父類的構造方法,
這裏partent=None,表示這個widget默認沒有父類。然後在裏面定義自己的需要的東西。
QtWidgets.qApp代表這個程序的全局對象。這裏我定義的widget很簡單,只有一個button,
當然,也可以定義一個複雜的widget,裏面有各種各樣的控件。'''

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章