1

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 システムで Qt 4.8 を使用して PySide 1.2.4 を実行しています)

4

1 に答える 1

2

ウィジェットの描画方法ではなく、アイコンのレンダリング方法を変更しようとしているようです。そのため、パレットは使用する適切な API ではありません。代わりに、QIconを使用する必要があります。これにより、さまざまなモード状態に異なる画像を使用できます。

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 ドキュメントの次の警告に注意してください。

カスタム アイコン エンジンは、追加で追加されたピックスマップを自由に無視できます。

したがって、これがすべてのプラットフォームのすべてのウィジェット スタイルで機能するという保証はありません。

更新

上記の方法が機能しない場合は、ウィジェット スタイルが無効なアイコンのレンダリング方法を制御していることを意味している可能性があります。関連するQStyleAPI はgeneratedIconPixmapで、アイコン モードとスタイル オプションに従って変更されたピックスマップのコピーを返します。この方法では、パレットも考慮される場合があるようです (上で述べたこととは多少逆です) - しかし、これをテストしたところ、何の影響もありませんでした次のようにパレットをリセットします。

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です。これを実装する方法を示すデモ スクリプトを次に示します。

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_())
于 2017-01-12T19:08:39.597 に答える