【发布时间】:2017-01-11 17:57:21
【问题描述】:
我正在尝试更改 QPalette 的当前颜色组,但似乎 QPalette 的 setCurrentColorGroup 方法根本不起作用。
我正在运行这段代码:
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_()
这是我得到的输出:
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 似乎什么都不做。关于如何更改当前颜色组的任何想法?
提前致谢!
(顺便说一句,我在 Windows 7 系统上运行 PySide 1.2.4 和 Qt 4.8)
【问题讨论】:
-
palette()方法是const &- 即在 python 术语中,它返回一个副本,而不是引用。所以您需要修改返回的调色板,然后使用button.setPalette(palette)应用更改。但是,使用setCurrentColorGroup仍然不太可能产生任何效果,因为该按钮仍将被禁用。此外,您需要注意某些样式不会使用调色板进行所有类型的绘图(这主要影响某些版本的 Windows 和 OSX)。也许你应该解释一下你试图通过这种方式使用调色板来实现什么。 -
@ekhumoro 我有一个按钮(QPushButton 的扁平无边框子类),它使用 svg 作为图标。源 svg 具有红色背景,当我禁用按钮时变为灰色。我不希望图标颜色失真。我不确切知道按钮在禁用时如何改变颜色,但我发现它应该与调色板有关,所以我尝试将调色板的 currentColorGroup 设置回 Normal(而不是 Disabled),但确实如此没什么……
-
@ekhumoro 我正在使用 PySide,所以我没有 const 变量或指针之类的东西。我验证了每次调用 button.palette() 时都会得到相同的 QPalette 实例,但这可能只是一个包装器?我会按照您的建议使用 setPalette() 尝试一下。
-
@ekhumoro 它也不起作用......事实上,创建一个 QPalette 然后在它上面使用 setCurrentColorGroup 也没有任何作用。我觉得这真的很奇怪:/
-
不,您通过 Python 使用 Qt,因此 C++ 签名始终是相关的。如果你不理解这个关键点,你将永远无法有效地使用 PySide/PyQt。在 Python 中,修改可变对象(例如列表)的副本,不会修改原始对象 - 在这方面 C++ 没有什么不同。因此,如果一个 Qt 方法返回一个
const&,那么,在 PySide 中,你会得到一个副本;但如果它返回一个指针,你会得到原来的。 PySide 只是 C++ 库的一个薄包装器。在 Qt 中调用 PySide 方法总是调用完全相同的方法。
标签: python windows qt pyside qpalette