首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改QPalette的当前颜色组

如何更改QPalette的当前颜色组
EN

Stack Overflow用户
提问于 2017-01-11 17:57:21
回答 1查看 1.7K关注 0票数 1

我试图更改QPalette当前的颜色组,但似乎QPalette的setCurrentColorGroup方法根本不起作用。

我正在运行这段代码:

代码语言:javascript
复制
app = QtGui.QApplication(sys.argv)

button = QPushButton()
svgWidget = QSvgWidget(resources_paths.getPathToIconFile("_playableLabels/42-labelPlay-disabled-c.svg"))

button.setLayout(QHBoxLayout())
button.layout().addWidget(svgWidget)

button.setFixedSize(QSize(300, 300))

print button.palette().currentColorGroup()
button.setEnabled(False)
print button.palette().currentColorGroup()
button.palette().setCurrentColorGroup(QPalette.ColorGroup.Normal)
print button.palette().currentColorGroup()
button.show()
print button.palette().currentColorGroup()

app.exec_()

这是我得到的输出:

代码语言:javascript
复制
PySide.QtGui.QPalette.ColorGroup.Normal
PySide.QtGui.QPalette.ColorGroup.Disabled
PySide.QtGui.QPalette.ColorGroup.Disabled
PySide.QtGui.QPalette.ColorGroup.Disabled

Process finished with exit code -1

所以..。setCurrentColorGroup似乎什么也不做。对于如何改变当前的颜色组有什么想法吗?

提前感谢!

(顺便说一句,我在Windows7系统上运行PySide 1.2.4和QT4.8)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 19:08:39

您似乎试图改变图标的呈现方式,而不是绘制小部件的方式,因此调色板不是正确使用的API。相反,您应该使用QIcon,它允许将不同的图像用于各种模式

要在NormalDisabled模式下使用相同的图像,可以使用如下代码:

代码语言:javascript
复制
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap('image.svg'), QtGui.QIcon.Normal)
icon.addPixmap(QtGui.QPixmap('image.svg'), QtGui.QIcon.Disabled)
button = QtGui.QPushButton()
button.setIcon(icon)

但是,您应该仔细注意来自Qt文档的这个警告:

自定义图标引擎可以忽略额外添加的像素映射。

因此,不能保证这将适用于所有平台上的所有小部件样式。

更新

如果上面的方法不起作用,这可能意味着小部件样式正在控制如何呈现禁用的图标。相关的QStyle API是generatedIconPixmap,它返回根据图标模式和样式选项修改的像素映射的副本。似乎这个方法有时也会考虑调色板(这与我上面所说的有些相反)--但是当我测试它时,它没有任何影响。我像这样重置调色板:

代码语言:javascript
复制
palette = self.button.palette()
palette.setCurrentColorGroup(QtGui.QPalette.Normal)
palette.setColorGroup(QtGui.QPalette.Disabled,
    palette.windowText(), palette.button(),
    palette.light(), palette.dark(), palette.mid(),
    palette.text(), palette.brightText(),
    palette.base(), palette.window(),
    )
button.setPalette(palette)

这使得当按钮被禁用时颜色看起来很正常,但是图标仍然是灰色的。尽管如此,您可能还是想尝试一下,以防在您的平台上出现不同的工作方式(如果没有的话,不要感到惊讶)。

控制图标禁用的正确方法似乎是创建一个QProxyStyle并重写generatedIconPixmap方法。不幸的是,这个类在PyQt4中是不可用的,但是我已经在PyQt5中测试过它,它可以工作。因此,我目前唯一可行的解决方案是升级到PyQt5,并使用QProxyStyle。下面是一个演示脚本,演示如何实现它:

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class ProxyStyle(QtWidgets.QProxyStyle):
    def generatedIconPixmap(self, mode, pixmap, option):
        if mode == QtGui.QIcon.Disabled:
            mode = QtGui.QIcon.Normal
        return super(ProxyStyle, self).generatedIconPixmap(
            mode, pixmap, option)

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton(self)
        self.button.setIcon(QtGui.QIcon('image.svg'))
        self.button2 = QtWidgets.QPushButton('Test', self)
        self.button2.setCheckable(True)
        self.button2.clicked.connect(self.button.setDisabled)    
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.button)
        layout.addWidget(self.button2)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    app.setStyle(ProxyStyle())
    window = Window()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41597598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档