如何更改 QPalette 的当前颜色组
How to change current color group for QPalette
我正在尝试更改 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 似乎什么也没做。关于如何更改当前颜色组的任何想法?
提前致谢!
(顺便说一句,我是 运行 PySide 1.2.4 和 Windows 7 系统上的 Qt 4.8)
您似乎在尝试更改图标的呈现方式,而不是小部件的绘制方式,因此调色板不适合 API 使用。相反,您应该使用 QIcon, which allows different images to be used for various modes and states.
要在 Normal
和 Disabled
模式下使用相同的图像,您可以使用如下代码:
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 文档中的警告:
Custom icon engines are free to ignore additionally added pixmaps.
因此不能保证这适用于所有平台上的所有小部件样式。
更新:
如果上述方法不起作用,则可能意味着小部件样式正在控制禁用图标的呈现方式。相关的 QStyle
API 是 generatedIconPixmap, which returns a copy of the pixmap modified according to the icon mode 和样式选项。貌似这个方法可能有时也会考虑调色板(和我上面说的有点相反)——但是我测试这个的时候,没有任何影响。我像这样重置调色板:
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
方法。不幸的是,这个 class 在 PyQt4 中是不可用的,但我在 PyQt5 中测试过它,它可以工作。所以目前我唯一可行的解决方案是升级到 PyQt5,并使用 QProxyStyle
。这是一个演示脚本,展示了如何实现它:
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_())
我正在尝试更改 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 似乎什么也没做。关于如何更改当前颜色组的任何想法?
提前致谢!
(顺便说一句,我是 运行 PySide 1.2.4 和 Windows 7 系统上的 Qt 4.8)
您似乎在尝试更改图标的呈现方式,而不是小部件的绘制方式,因此调色板不适合 API 使用。相反,您应该使用 QIcon, which allows different images to be used for various modes and states.
要在 Normal
和 Disabled
模式下使用相同的图像,您可以使用如下代码:
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 文档中的警告:
Custom icon engines are free to ignore additionally added pixmaps.
因此不能保证这适用于所有平台上的所有小部件样式。
更新:
如果上述方法不起作用,则可能意味着小部件样式正在控制禁用图标的呈现方式。相关的 QStyle
API 是 generatedIconPixmap, which returns a copy of the pixmap modified according to the icon mode 和样式选项。貌似这个方法可能有时也会考虑调色板(和我上面说的有点相反)——但是我测试这个的时候,没有任何影响。我像这样重置调色板:
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
方法。不幸的是,这个 class 在 PyQt4 中是不可用的,但我在 PyQt5 中测试过它,它可以工作。所以目前我唯一可行的解决方案是升级到 PyQt5,并使用 QProxyStyle
。这是一个演示脚本,展示了如何实现它:
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_())