成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PyQt5快速入門(六)PyQt5GUI界面設(shè)計-創(chuàng)新互聯(lián)

PyQt5快速入門(六)PyQt5 GUI界面設(shè)計

一、窗口風(fēng)格

1、設(shè)置窗口風(fēng)格

Qt實(shí)現(xiàn)的窗口樣式默認(rèn)使用的是當(dāng)前操作系統(tǒng)的原生窗口樣式,在不同操作系統(tǒng)下原生窗口樣式顯示的風(fēng)格是不一樣的。
可以為每個Widget設(shè)置風(fēng)格:
setStyle(QStyle style)
獲取當(dāng)前平臺支持的原有QStyle樣式
QStyleFactory.keys()
對QApplication設(shè)置QStyle樣式
QApplication.setStyle(QStyleFactory.create(“WindowsXP”))
如果其它Widget沒有設(shè)置QStyle,則默認(rèn)使用QApplication使用的QStyle。

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)珉田數(shù)據(jù)中心的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗和案例。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QHBoxLayout()
        label = QLabel("Set Style:",self)
        combo = QComboBox(self)
        combo.addItems(QStyleFactory.keys())
        # 選擇當(dāng)前窗口風(fēng)格
        index = combo.findText(QApplication.style().objectName(), Qt.MatchFixedString)
        # 設(shè)置當(dāng)前窗口風(fēng)格
        combo.setCurrentIndex(index)
        combo.activated[str].connect(self.onCurrentIndexChanged)

        self.layout.addWidget(label)
        self.layout.addWidget(combo)

        self.setLayout(self.layout)
        self.setWindowTitle("Application Style")
        self.resize(300, 100)

    def onCurrentIndexChanged(self, style):
        QApplication.setStyle(style)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

2、設(shè)置窗口樣式

PyQt5使用setWindowFlags(Qt.WindowFlags)函數(shù)設(shè)置窗口樣式。
Qt的窗口類型如下:
Qt.Widget:默認(rèn)窗口,由大化、最小化、關(guān)閉按鈕
Qt.Window:普通窗口,有大化、最小化、關(guān)閉按鈕
Qt.Dialog:對話框窗口,有問號和關(guān)閉按鈕
Qt.Popup:彈出窗口,窗口無邊框
Qt.ToolTip:提示窗口,窗口無邊框,無任務(wù)欄
Qt.SplashScreen:閃屏,窗口無邊框,無任務(wù)欄
Qt.SubWindow:子窗口,窗口無按鈕,但有標(biāo)題欄
Qt自定義的頂層窗口外觀標(biāo)識:
Qt.MSWindowsFixedSizeDialogHint:窗口無法調(diào)整大小
Qt.FrameLessWindowHint:窗口無邊框
Qt.CustomWinodwHint:有邊框但無標(biāo)題欄和按鈕,不能移動和拖動
Qt.WindowTitleHint:添加一個標(biāo)題欄和一個關(guān)閉按鈕
Qt.WindowSystemMenuHint:添加系統(tǒng)目錄和一個關(guān)閉按鈕
Qt.WindowMaximizeButtonHint:激活大化和關(guān)閉按鈕,禁止最小化按鈕
Qt.WindowMinimizeButtonHint:激活最小化和關(guān)閉按鈕,禁止大化按鈕
Qt.WindowMinMaxButtonsHint:激活大化、最小化和關(guān)閉按鈕
Qt.WindowCloseButtonHint:增加一個關(guān)閉按鈕
Qt.WindowContextHelpButtonHint:增加問號和關(guān)閉按鈕
Qt.WindowStaysOnTopHint:窗口始終處于頂層位置
Qt.WindowStaysOnBottomHint:窗口始終處于底層位置

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.setWindowFlags(Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint)
        self.resize(400, 200)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

3、自定義窗口

自定義一個無邊框、鋪滿整個顯示屏的窗口實(shí)現(xiàn)如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.setWindowFlags(Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint)
        self.setStyleSheet("background-color:blue;")

    def showMaximized(self):
        # 獲取桌面控件
        desktop = QApplication.desktop()
        # 獲取屏幕可顯示矩形區(qū)域
        rect = desktop.availableGeometry()
        # 設(shè)置窗口尺寸
        self.setGeometry(rect)
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.showMaximized()

    sys.exit(app.exec_())

二、繪圖

1、圖像類

Qt中有四個圖像類,QPixmap、QImage、QPicture、QBitmap。
QPixmap專為繪圖而設(shè)計,在繪制圖片時需要QPixmap。
QImage提供了一個與硬件無關(guān)的圖像表示函數(shù),可以用于圖片的像素級訪問。
QPicture是繪圖設(shè)備類,繼承自QPainter,可以使用QPainter的begin函數(shù)在QPicture上繪圖,使用end結(jié)束繪圖,使用QPicture的save函數(shù)將QPainter使用過的繪圖指令保存到文件中。
QBitmap是一個繼承自QPixmap的便利類,提供了1bit深度的二值圖像的類,提供的單×××像可以用來制作游標(biāo)QCursor或者畫刷QBrush。

2、繪圖

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.pix = QPixmap(400, 400)
        self.pix.fill(Qt.white)
        self.lastPoint = QPoint()
        self.endPoint = QPoint()
        self.setWindowFlags(Qt.WindowTitleHint)
        self.resize(400, 400)

    def paintEvent(self, event):
        painter = QPainter(self.pix)
        painter.drawLine(self.lastPoint, self.endPoint)
        self.lastPoint = self.endPoint
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix)

    def mouseMoveEvent(self, event):
        if event.buttons() and Qt.LeftButton:
            self.endPoint = event.pos()
            self.update()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.lastPoint = event.pos()
            self.endPoint = self.lastPoint

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.endPoint = event.pos()
            self.update()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

3、雙緩沖繪圖

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.pix = QPixmap(400, 400)
        self.pix.fill(Qt.white)
        self.lastPoint = QPoint()
        self.endPoint = QPoint()
        self.setWindowFlags(Qt.WindowTitleHint)
        self.resize(400, 400)

    def paintEvent(self, event):
        painter1 = QPainter(self)
        x = self.lastPoint.x()
        y = self.lastPoint.y()
        w = self.endPoint.x() - x
        h = self.endPoint.y() - y
        # 將圖形會值在PixMap畫布
        painter2 = QPainter(self.pix)
        painter2.drawRect(x, y, w, h)
        # 將pximap繪制到窗口
        painter1.drawPixmap(0, 0, self.pix)

    def mouseMoveEvent(self, event):
        if event.buttons() and Qt.LeftButton:
            self.endPoint = event.pos()
            self.update()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.lastPoint = event.pos()
            self.endPoint = self.lastPoint

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.endPoint = event.pos()
            self.update()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

上述代碼中,首先使用painter將圖形繪制在Pixmap上,然后將Pixmap繪制到窗口中。在拖動鼠標(biāo)繪制矩形的過程中會出現(xiàn)重影,鼠標(biāo)拖動過程中,屏幕會刷新很多次,paintEvent函數(shù)會被執(zhí)行很多次,每次都會繪制一個矩形。
為了避免重影,可以使用雙緩沖繪制技術(shù)。即使用兩塊畫布,pix和tempPix,tempPix作為臨時緩沖區(qū),當(dāng)拖動鼠標(biāo)繪制矩形時,將內(nèi)容先繪制到tempPix上,然后再將tempPix繪制到界面窗口。當(dāng)釋放鼠標(biāo)完成矩形繪制時,將tempPix的內(nèi)容復(fù)制到pix緩沖區(qū),最終完成繪制到窗口。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.pix = QPixmap(400, 400)
        self.pix.fill(Qt.white)
        self.lastPoint = QPoint()
        self.endPoint = QPoint()
        self.setWindowFlags(Qt.WindowTitleHint)
        self.resize(400, 400)
        self.isDrawing = False
        self.tempPix = QPixmap()

    def paintEvent(self, event):
        painter = QPainter(self)
        x = self.lastPoint.x()
        y = self.lastPoint.y()
        w = self.endPoint.x() - x
        h = self.endPoint.y() - y
        if self.isDrawing:
            self.tempPix = self.pix
            pp = QPainter(self.tempPix)
            pp.drawRect(x, y, w, h)
            painter.drawPixmap(0, 0, self.tempPix)
        else:
            pp = QPainter(self.pix)
            pp.drawRect(x, y, w, h)
            painter.drawPixmap(0, 0, self.pix)

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.lastPoint = event.pos()
            self.endPoint = self.lastPoint
            self.isDrawing = True

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.endPoint = event.pos()
            self.update()
            self.isDrawing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

三、QSS樣式設(shè)置

1、QSS語法規(guī)則

QSS(Qt Style Sheets),即Qt樣式表,是用來自定義控件外觀的一種機(jī)制。QSS語法規(guī)則與CSS大體相同,QSS樣式由兩部分組成,選擇器用于指定哪些控件受到影響,聲明用于指定哪些屬性應(yīng)該在控件上進(jìn)行設(shè)置。聲明部分是一系列的“屬性:值”,使用分號分隔各個不同的屬性值對,使用大括號將所有的聲明包括在內(nèi)。
QPushButton{color:red;}
表示設(shè)置QPushButton及其子類所有實(shí)例的前景色為紅色,QPushButton表示選擇器,指定所有的QPushButton類及其子類都會受到影響。
可以使用多個選擇器指定相關(guān)的聲明,使用逗號將各個選擇器分隔,如QPushButton,QLineEdit{color:red;}

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        button = QPushButton("Button")
        self.layout = QHBoxLayout()
        self.layout.addWidget(button)
        self.setLayout(self.layout)
        qss = "QPushButton{color:red;}"
        self.setStyleSheet(qss)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

2、QSS選擇器類型

QSS選擇器有如下幾種類型:
1、通配選擇器:*,匹配所有的控件
2、類型選擇器,如QPushButton,用于匹配所有的類及其子類的實(shí)例。
3、屬性選擇器:匹配所有的屬性及屬性值的實(shí)例,如QPushButton[name=”okButton”]將匹配所有的name屬性為okButton的按鈕實(shí)例。
4、類選擇器:.ClassName,如.QPushButton用于匹配所有的QPushButton實(shí)例,但不匹配其子類。
5、ID選擇器:#objectName,如#okButton匹配所有的ID為okButton的控件,ID即為obejctName。
6、后代選擇器:如QDialog QPushButton,匹配所有的QDialog容器中包含的QPushButton,不管是直接的還是間接的。
7、子選擇器:如QDialog > QPushButton,匹配所有的QDialog容器中包含的QPushButton,要求QPushButton的直接父容器是QDialog。
3、QSS子控件
QSS子控件是一種選擇器,通常應(yīng)用在復(fù)雜控件上,如QComboBox,QComboBox有一個矩形的外邊框,右邊有一個下拉箭頭,點(diǎn)擊后會彈出下拉列表。
::drop-down子控件選擇器可以與選擇器組合使用,
QComboBox#combo::drop-down{imge:url(dropdown.png)}表示為指定ID為combo的QComboBox控件的下拉箭頭自定義圖標(biāo)。

4、QSS偽狀態(tài)

QSS偽狀態(tài)選擇器是以:開頭的一個選擇表達(dá)式,如:hover,表示當(dāng)鼠標(biāo)經(jīng)過時的狀態(tài)。偽狀態(tài)選擇器限制了當(dāng)控件處于某種狀態(tài)時才可以使用的QSS規(guī)則,偽狀態(tài)只能描述一個控件或復(fù)合控件的子控件狀態(tài),因此只能放在選擇器的最后面。
QComboBox::drop-down:hover{background-color:red;}

5、QDarkStyleSheet

QDarkStyleSheet是一個用于PyQt應(yīng)用的深黑色樣式表。
GitHub:
https://github.com/ColinDuquesnoy/QDarkStyleSheet

四、設(shè)置窗口背景

窗口背景主要包括背景色和背景圖片。設(shè)置窗口背景主要有三種方法:QSS設(shè)置窗口背景;QPalette設(shè)置窗口背景;paintEvent函數(shù)內(nèi)部使用QPainter繪制窗口背景。

1、QSS設(shè)置窗口背景

通過QSS可以設(shè)置窗口的背景色或背景圖片。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName("mainWindow")
        qss = "QWidget#mainWindow{background-color:black;}"
        # qss = "QWidget#mainWindow{border-image:url(background.png);}"
        self.setStyleSheet(qss)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

2、QPalette設(shè)置窗口背景

使用QPalette設(shè)置窗口背景顏色。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        palette = QPalette()
        palette.setColor(QPalette.Background, Qt.black)
        self.setPalette(palette)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

使用QPalette設(shè)置窗口背景圖片時,需要考慮背景圖片的尺寸,當(dāng)背景圖片的寬度和高度大于窗口的寬度和高度時,背景圖片將會平鋪整個窗口;當(dāng)背景圖片的寬度和高度小于窗口的寬度和高度時,則加載多個背景圖片。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        palette = QPalette()
        palette.setBrush(QPalette.Background, QBrush(QPixmap("background.png")))
        self.setPalette(palette)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

3、paintEvent繪制窗口背景

在paintEvent函數(shù)內(nèi)部繪制背景色:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setBrush(Qt.black)
        painter.drawRect(self.rect())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

在paintEvent函數(shù)內(nèi)部繪制背景圖片:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")

    def paintEvent(self, event):
        painter = QPainter(self)
        pixmap = QPixmap("background.png")
        painter.drawPixmap(self.rect(), pixmap)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

五、樣式設(shè)置實(shí)例

1、為標(biāo)簽添加背景圖片

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.layout = QVBoxLayout()
        label = QLabel()
        label.setStyleSheet("QLabel{border-image:url(background.png);}")
        label.setFixedHeight(400)
        label.setFixedWidth(600)
        self.layout.addWidget(label)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

2、為按鈕添加背景圖片

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.layout = QVBoxLayout()
        button = QPushButton("Button")
        button.setMaximumSize(60, 30)
        button.setObjectName("okButton")
        button.setStyleSheet("QPushButton#okButton{border-image:url(background.png);}")

        self.layout.addWidget(button)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

3、縮放圖片

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.layout = QVBoxLayout()
        label = QLabel()
        img = QImage("background.png")
        result = img.scaled(label.width(), label.height(),Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
        label.setPixmap(QPixmap.fromImage(result))

        self.layout.addWidget(label)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

4、設(shè)置窗口透明

如果窗口是透明的,通過窗口可以看到桌面,要想實(shí)現(xiàn)窗口的透明效果,需要設(shè)置窗口透明度。透明度取值范圍為0(完全透明)到1(不透明)。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MainWindow")
        self.setWindowOpacity(0.5)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

5、加載QSS

Qt中,為了降低耦合性,將UI代碼與業(yè)務(wù)邏輯代碼進(jìn)行分離,通常會定義QSS文件,編寫各種控件的樣式,最后使用QApplication.setStyleSheet或QWidget.setStyleSheet設(shè)置QSS。
通常編寫QSS文件需要加載到qrc資源文件中,然后編寫一個公用類加載QSS。

class CommonHelper(object):
    @staticmethod
    def setStyleSheet(filename):
        if filename is not None:
            style = ""
            with open(filename, "r") as f:
                style = f.read()
            qApp.setStyleSheet(style)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前文章:PyQt5快速入門(六)PyQt5GUI界面設(shè)計-創(chuàng)新互聯(lián)
文章來源:http://jinyejixie.com/article20/dpsjjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、定制開發(fā)、品牌網(wǎng)站設(shè)計營銷型網(wǎng)站建設(shè)、網(wǎng)站維護(hù)品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
阳曲县| 修水县| 抚顺县| 龙南县| 罗田县| 通城县| 辛集市| 棋牌| 平塘县| 托里县| 河池市| 丰顺县| 安平县| 井冈山市| 麦盖提县| 信宜市| 满城县| 平阳县| 盐边县| 运城市| 陈巴尔虎旗| 锦屏县| 布尔津县| 九江县| 汝城县| 五原县| 抚顺市| 肃北| 北辰区| 商洛市| 定安县| 平阴县| 本溪| 沿河| 富源县| 许昌市| 河曲县| 昆明市| 龙江县| 合水县| 阿拉善左旗|