依照QStyleH的QProxyStyle

2024-05-27 11:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码改编自here,它在QMenu中通过右对齐快捷方式来工作。当没有应用样式表时,它可以很好地工作。在

{a2}

但是当我加上app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())这行就不起作用了。 enter image description here

from PyQt5 import QtCore, QtGui, QtWidgets

class MenuProxyStyle(QtWidgets.QProxyStyle):

    def drawControl(self, element, option, painter, widget=None):
        shortcut = ""
        if element == QtWidgets.QStyle.CE_MenuItem:
            vals = option.text.split("\t")
            if len(vals) == 2:
                text, shortcut = vals
                option.text = text
        super(MenuProxyStyle, self).drawControl(element, option, painter,     widget)
        if shortcut:
            margin = 10 # QStyleHelper::dpiScaled(5)
            return self.proxy().drawItemText(painter,     option.rect.adjusted(margin, 0, -margin, 0), 
            QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter,
            option.palette, option.state & QtWidgets.QStyle.State_Enabled, 
            shortcut, QtGui.QPalette.Text)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        menu = QtWidgets.QMenu("File", self)
        self.menuBar().addMenu(menu)

        # create icons
        data = [("Absolute", "Ctrl+Alt+C"),
                 ("Relative", "Ctrl+Shift+C"),
                 ("Copy", "Ctrl+C")]

        for text, shortcut in data:
            action = QtWidgets.QAction(self)
            action.setText(text+"\t"+shortcut)
            menu.addAction(action)

if __name__ == '__main__':
    import sys, qdarkstyle
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle(MenuProxyStyle())
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

我想知道如何将QStyle与QStyleSheet结合起来?


Tags: textmarginselfappifelementshortcutoption
1条回答
网友
1楼 · 发布于 2024-05-27 11:17:21

Qt样式表和QProxyStyle是不同的层,不能合并,当Qt样式表建立时,会创建一个QStyleSheetStyle对象,不允许覆盖它,所以您会发现没有调用QProxyStyle的方法。在

所以解决方案是只使用Qt样式表来建立相同的功能,所以您应该修改qdarkstyle提供的样式表,在本例中,您将使用qstylizer库。在

如果有python2,则必须使用以下命令进行安装:

pip install qstylizer

如果您使用python3,则不能直接使用该库,因为它使用了python3中不再存在的unicode,因为它有一个bug,但是我有一个fork可以解决它,您可以使用以下方法进行安装:

^{pr2}$

考虑到上述情况,解决方案是:

# ...

if __name__ == "__main__":
    import sys
    import qdarkstyle
    import qstylizer.parser

    app = QtWidgets.QApplication(sys.argv)

    qss = qstylizer.parser.parse(qdarkstyle.load_stylesheet_pyqt5())
    qss.QMenu.item.padding.setValue("4px 4px 4px 4px;")
    app.setStyleSheet(qss.toString())

    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题