天天看點

mfc groupbox 成組設定控件可見_實戰PyQt5: 105-設定應用的顯示風格設定應用顯示風格Qt内建顯示風格測試本文知識點

mfc groupbox 成組設定控件可見_實戰PyQt5: 105-設定應用的顯示風格設定應用顯示風格Qt内建顯示風格測試本文知識點

在一個GUI應用中,預設風格一般是和作業系統相統一的,但是有時候我們需要讓應用有自己特定的風格,這時候我們就可以使Qt内建的各種主題樣式來改變我們的應用程式外觀。

設定應用顯示風格

QWidget.setStyle(style:QStyle)函數可以設定應用的顯示風格,要擷取目前平台所支援的顯示風格,可以使用QStyleFactory.keys()來獲得,它以字元串清單的形式傳回目前系統所支援的風格樣式。使用方法QApplication.setStyle()可設定應用視窗的顯示風格。如:

QApplication.setStyle(QStyleFactory.create('WindowsXP'))

如果一個QWidget未設定自己的顯示風格,預設使用QApplication設定的風格。

Qt包含一組QStyle子類,這些子類可模拟Qt支援的不同平台的樣式(QWindowsStyle,QMacStyle等)。預設情況下,這些樣式内置在Qt GUI子產品中。樣式也可以作為插件使用。

Qt的内置視窗部件使用QStyle來執行幾乎所有的繪圖,進而確定它們看起來完全等同于等效的本機視窗小部件。下圖顯示了九種不同樣式的QComboBox。

mfc groupbox 成組設定控件可見_實戰PyQt5: 105-設定應用的顯示風格設定應用顯示風格Qt内建顯示風格測試本文知識點

圖檔來源:doc.qt.io

Qt内建顯示風格測試

測試代碼采用了pyqt5中的styles.py,添加月曆控件顯示,示範各種控件在不同的顯示風格下的外觀。 完整代碼如下:

import sysfrom PyQt5.QtCore import Qt, QTimer, QDateTime, QDatefrom PyQt5.QtGui import QIconfrom PyQt5.QtWidgets import (QApplication, QWidget, QDialog, QPushButton, QTextEdit,                              QGroupBox, QCheckBox, QRadioButton, QComboBox, QLabel,                             QVBoxLayout, QHBoxLayout, QGridLayout, QStyleFactory,                             QTabWidget, QSizePolicy, QProgressBar, QTableWidget,                             QLineEdit, QSpinBox, QDateTimeEdit, QSlider,                             QScrollBar, QDial, QCalendarWidget) #标記控制視窗class WindowStyleDemo(QDialog):    def __init__(self):        super(WindowStyleDemo, self).__init__()                # 設定視窗标題        self.setWindowTitle('實戰PyQt5: 應用顯示風格示範')                #應用的初始調色闆        self.origPalette = QApplication.palette()                self.initUi()            def initUi(self):        styleComboBox = QComboBox()        styleKeys = QStyleFactory.keys()        print(styleKeys)        #添加系統内建的顯示風格        styleComboBox.addItems(styleKeys)                #最頂端顯示控制部分        styleLabel = QLabel('顯示風格(&S):')        styleLabel.setBuddy(styleComboBox)                self.chkUseStylePalette = QCheckBox('使用标準調色闆(&U)')        self.chkUseStylePalette.setChecked(True)                chkDisableWidgets = QCheckBox('禁用控件(&D)')                #生成要顯示的部件        self.createTopLeftGroupBox()        self.createTopRightGroupBox()        self.createBottomLeftTabWidget()        self.createBottomRightGroupBox()        self.createProgressBar()                styleComboBox.activated[str].connect(self.changeStyle)        self.chkUseStylePalette.toggled.connect(self.changePalette)        chkDisableWidgets.toggled.connect(self.setWidgetsDisbaled)                topLayout = QHBoxLayout()        topLayout.addWidget(styleLabel)        topLayout.addWidget(styleComboBox)        topLayout.addStretch(1)        topLayout.addWidget(self.chkUseStylePalette)        topLayout.addWidget(chkDisableWidgets)                mainLayout = QGridLayout()        mainLayout.addLayout(topLayout, 0, 0, 1, 2) # 0行0列,占1行2列        mainLayout.addWidget(self.topLeftGroupBox, 1, 0) #1行0列        mainLayout.addWidget(self.topRightGroupBox, 1, 1) #1行1列        mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0) #2行0列        mainLayout.addWidget(self.bottomRightGroupBox, 2, 1) #2行1列        mainLayout.addWidget(self.progressBar, 3, 0, 1, 2) ## 3行0列,占1行2列        mainLayout.setRowStretch(1, 1)        mainLayout.setRowStretch(2, 1)        mainLayout.setColumnStretch(0, 1)        mainLayout.setColumnStretch(1, 1)                self.setLayout(mainLayout)                #如果風格'Windows'存在,則将風格設定為'Windows'        for index, style in  enumerate(styleKeys):            if(style == 'Windows'):                self.changeStyle('Windows')                styleComboBox.setCurrentIndex(index)            #改變顯示風格     def changeStyle(self, styleName):        QApplication.setStyle(QStyleFactory.create(styleName))        self.changePalette()            #改變調色闆        def changePalette(self):        if(self.chkUseStylePalette.isChecked()):            QApplication.setPalette(QApplication.style().standardPalette())        else:            QApplication.setPalette(self.origPalette)        #建立左上角成組部件    def createTopLeftGroupBox(self):        self.topLeftGroupBox = QGroupBox('組 1')                rad1 = QRadioButton('單選按鈕1')        rad2 = QRadioButton('單選按鈕2')        rad3 = QRadioButton('單選按鈕3')        rad1.setChecked(True)                chk = QCheckBox('三态複選按鈕')        chk.setTristate(True)        chk.setCheckState(Qt.PartiallyChecked)                layout = QVBoxLayout()        layout.addWidget(rad1)        layout.addWidget(rad2)        layout.addWidget(rad3)        layout.addWidget(chk)        layout.addStretch(1)                self.topLeftGroupBox.setLayout(layout)            #建立右上角成組部件    def createTopRightGroupBox(self):        self.topRightGroupBox = QGroupBox('組 2')                btnDefault = QPushButton('Push Button:預設模式')        btnDefault.setDefault(True)                btnToggle = QPushButton('Push Button: 切換模式')        btnToggle.setCheckable(True)        btnToggle.setChecked(True)                btnFlat = QPushButton('Push Button: 扁平外觀')        btnFlat.setFlat(True)                layout = QVBoxLayout()        layout.addWidget(btnDefault)        layout.addWidget(btnToggle)        layout.addWidget(btnFlat)        layout.addStretch(1)                self.topRightGroupBox.setLayout(layout)            #建立左下角Tab控件    def createBottomLeftTabWidget(self):        self.bottomLeftTabWidget = QTabWidget()        self.bottomLeftTabWidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Ignored)                tab1 = QWidget()        tableWidget = QTableWidget(10, 10)  #10行10列                tab1Layout = QHBoxLayout()        tab1Layout.setContentsMargins(5,5,5,5)        tab1Layout.addWidget(tableWidget)        tab1.setLayout(tab1Layout)                tab2 = QWidget()        textEdit = QTextEdit()        textEdit.setPlainText("一閃一閃小星星,"                              "我想知道你是什麼."                               "在整個世界之上, 如此的高,"                              "像在天空中的鑽石."                              "一閃一閃小星星,"                               "我多想知道你是什麼!")                tab2Layout = QHBoxLayout()        tab2Layout.setContentsMargins(5, 5, 5, 5)        tab2Layout.addWidget(textEdit)        tab2.setLayout(tab2Layout)                tab3 = QWidget()        calendar = QCalendarWidget()        #設定最小日期        calendar.setMinimumDate(QDate(1900,1,1))        #設定最大日期        calendar.setMaximumDate(QDate(4046,1,1))        #設定網格可見        calendar.setGridVisible(True)        tab3Layout = QHBoxLayout()        tab3Layout.setContentsMargins(5, 5, 5, 5)        tab3Layout.addWidget(calendar)        tab3.setLayout(tab3Layout)                self.bottomLeftTabWidget.addTab(tab1, '表格(&T)')        self.bottomLeftTabWidget.addTab(tab2, '文本編輯(&E)')        self.bottomLeftTabWidget.addTab(tab3, '月曆(&C)')             #建立又下角成組部件    def createBottomRightGroupBox(self):        self.bottomRightGroupBox = QGroupBox('組 3')        self.bottomRightGroupBox.setCheckable(True)        self.bottomRightGroupBox.setChecked(True)                lineEdit = QLineEdit('s3cRe7')        lineEdit.setEchoMode(QLineEdit.Password)                spinBox = QSpinBox(self.bottomRightGroupBox)        spinBox.setValue(50)                dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)        dateTimeEdit.setDateTime(QDateTime.currentDateTime())                slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)        slider.setValue(40)                scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)        scrollBar.setValue(60)                dial = QDial(self.bottomRightGroupBox)        dial.setValue(30)        dial.setNotchesVisible(True)                layout = QGridLayout()        layout.addWidget(lineEdit, 0, 0, 1, 2)  #0行0列,占1行2列        layout.addWidget(spinBox, 1, 0, 1, 2)   #1行0列,占1行2列        layout.addWidget(dateTimeEdit, 2, 0, 1, 2) #2行0列,占1行2列        layout.addWidget(slider, 3, 0)  #3行0列,占1行3列        layout.addWidget(scrollBar, 4, 0) #4行0列,占1行1列        layout.addWidget(dial, 3, 1, 2, 1)  #3行1列,占2行1列        layout.setRowStretch(5, 1)                self.bottomRightGroupBox.setLayout(layout)            #禁止視窗上的元件    def setWidgetsDisbaled(self, disable):        self.topLeftGroupBox.setDisabled(disable)        self.topRightGroupBox.setDisabled(disable)        self.bottomLeftTabWidget.setDisabled(disable)        self.bottomRightGroupBox.setDisabled(disable)            #建立進度條    def createProgressBar(self):        self.progressBar = QProgressBar()        self.progressBar.setRange(0, 10000)        self.progressBar.setValue(0)                # 定時器,定時更新進度條的值        timer = QTimer(self)        timer.timeout.connect(self.advanceProgressBar)        timer.start(100)            #設定進度條的值            def advanceProgressBar(self):        curVal = self.progressBar.value()        maxVal = self.progressBar.maximum()        self.progressBar.setValue(curVal + (maxVal - curVal)//100)     if __name__ == '__main__':    app = QApplication(sys.argv)    windows = WindowStyleDemo()    windows.show()    sys.exit(app.exec())     
           

運作測試效果如下圖:

mfc groupbox 成組設定控件可見_實戰PyQt5: 105-設定應用的顯示風格設定應用顯示風格Qt内建顯示風格測試本文知識點

應用顯示風格測試

本文知識點

  • 設定應用的不同顯示風格;
  • 設定系統調色闆;
  • QGroupBox的setCheckable()功能;
  • 使用QTimer。

喜歡本文内容就多多關注,評論,收藏,點贊,和轉發。

繼續閱讀