从QComboBox中的样式列表中使用QStyleFactory设置样式

dra*_*ire 3 python pyqt4 qcombobox qstyle

我一直在使用PyQt4实现一个应用程序。

屏幕截图2

在此应用程序中,我想根据用户的选择来设置样式,并且我希望在不重新启动对话框的情况下设置样式。

这是我的代码,它会影响样式区域:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtGui

styles = ["Plastique","Cleanlooks","CDE","Motif","GTK+"]

class AppWidget(QWidget):
    def __init__(self,parent=None):
        super(AppWidget,self).__init__(parent)

        global styles # declaring global

        # I've skipped the useless codes

        horizontalLayout = QHBoxLayout()
        self.styleLabel =QLabel("Set Style:")
        self.styleComboBox = QComboBox()
        self.styleComboBox.addItems(styles) # adding the styles list
        horizontalLayout.addWidget(self.styleLabel)
        horizontalLayout.addWidget(self.styleComboBox)

        # skip more code

        self.setLayout(layout)

    def getStyle(self):
        return self.styleComboBox.currentIndex() # get the current index from combobox

        # another way i also implement is :
        # return self.styleComboBox.currentText()
        # after that i remove the global and directly access using this method 
        # which is of no success

if __name__ == "__main__":
    global styles # declaring global
    app = QApplication(sys.argv)
    widgetApp = AppWidget()

    i = widgetApp.getStyle() # assign the index here
    QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styles[i])) # setting the style

    widgetApp.show()
    app.exec_()
    print i
Run Code Online (Sandbox Code Playgroud)

但是我一直只获得“ Plastique”风格。

ekh*_*oro 6

您不需要样式的全局列表,因为QStyleFactory.keys已经提供了该列表

您需要做的是将这些键加载到组合框中,将组合框索引设置为当前样式,然后将组合框activated信号连接到处理程序,以便可以更改样式。

这样的事情应该起作用:

import sys
from PyQt4 import QtCore, QtGui

class AppWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(AppWidget, self).__init__(parent)
        horizontalLayout = QtGui.QHBoxLayout()
        self.styleLabel = QtGui.QLabel("Set Style:")
        self.styleComboBox = QtGui.QComboBox()
        # add styles from QStyleFactory
        self.styleComboBox.addItems(QtGui.QStyleFactory.keys())
        # find current style
        index = self.styleComboBox.findText(
                    QtGui.qApp.style().objectName(),
                    QtCore.Qt.MatchFixedString)
        # set current style
        self.styleComboBox.setCurrentIndex(index)
        # set style change handler
        self.styleComboBox.activated[str].connect(self.handleStyleChanged)
        horizontalLayout.addWidget(self.styleLabel)
        horizontalLayout.addWidget(self.styleComboBox)
        self.setLayout(horizontalLayout)

    # handler for changing style
    def handleStyleChanged(self, style):
        QtGui.qApp.setStyle(style)

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    widgetApp = AppWidget()
    widgetApp.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)