2017-04-24 5 views
8

少し動作が変更されたQActionが必要です。 QActionがチェックされるたびに信号を出すだけでなく、QActionが無効になっていてもチェックボックスを常にチェック可能にします。たとえば、QActionをsetEnabled(False)に設定した場合、QActionをクリックしたり、チェックをオン/オフすることはできません。私はそれがもうクリックできないのが好きですが、QAction内のチェックボックスを切り替えることはできません。私が探しているものを得るためにそれを変更することは可能ですか?PyQt - 無効にしてもQActionをチェック可能にします。

私は以下のサンプルファイルを添付しました。目標は、QActionが無効に設定されている(setEnabled(False))解決策をいくつか作成することですが、ユーザーは引き続きチェック/チェック解除できます。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

'''An example file with a QAction that stays checkable.''' 

# IMPORT STANDARD LIBRARIES 
import sys 

# IMPORT THIRD-PARTY LIBRARIES 
from Qt import QtWidgets 
from Qt import QtCore 


class AlwaysOpenAction(QtWidgets.QAction): 
    def __init__(self, *args, **kwargs): 
     super(AlwaysOpenAction, self).__init__(*args, **kwargs) 
     self.toggled.connect(self.printout) 

    def printout(self): 
     if self.isChecked(): 
      print('Checkbox was checked') 


class WindowTest(QtWidgets.QWidget): 

    '''A basic window.''' 

    def __init__(self, parent=None): 
     '''Init the window.''' 
     super(WindowTest, self).__init__(parent=parent) 
     self.setLayout(QtWidgets.QHBoxLayout()) 
     self.menubar = QtWidgets.QMenuBar(parent=self) 
     self.menu = self.menubar.addMenu('Some menu') 

     action = AlwaysOpenAction('something', self.menu) 
     action.setCheckable(True) 
     action.setEnabled(False) 

     self.menu.addAction(action) 
     self.layout().addWidget(self.menubar) 
     self.resize(500, 400) 


def main(): 
    '''Do the window test.''' 
    qapp = QtWidgets.QApplication(sys.argv) 
    window = WindowTest() 
    window.show() 
    sys.exit(qapp.exec_()) 


if __name__ == '__main__': 
    main() 
+1

私はそれが何のために良いのか分かりますか?おそらく、あなたの問題の別の解決策を考え出すことができます。 f QActions。 – Matho

+0

ええ、確かに。基本的には、私はいくつかのツールを含むメニューを持つアプリケーションを持っています。一部のツールには依存関係があり、他のツールには依存しません。ツールによっては、依存関係が自動的に設定されるものがあるため、実行するたびに他のツールと同じようにツール自体を押す必要はありません。彼らは一度ロード/アンロードする必要があります。 実行時の動作がない場合は、実際にQActionのクリック機能を実行せずに依存関係をオン/オフにする方法が必要ですが、ユーザーに表示することもできます(通常、またはそれをunclickableにする) – ColinKennedy

+0

あなたは私のことをよりよく説明することができます。あなたの質問は非常に混乱しています。 – eyllanesc

答えて

2

QActionをクリックしてQActionを無効にする必要はないと思うので、QActionをクリックしてチェックを外したいと思っているからです。代わりに、その外観を変えることができます。 Stylesheetを使いこなしてみましたか?

ちょうどあなたのコード内でこの単純な行を追加しよう:

self.menu.setStyleSheet("""color: gray;""") 

それでは、私はここに言うことをしようとしていることは、あなたがあなたの意志に応じて、あなたのqactionのスタイルを変更することができるということです。

また、もっと精巧で具体的なやり方を試すこともできます。上の行はメニュー内のすべてのテキストを灰色に変え、フォントの色を変更するオブジェクトの種類を指定することができます。あなたが望むものを達成するために他のいくつかのアプローチを試みることができる

self.menu.setStyleSheet("""QPushButton{background-color: red}""") 

などは...、時には我々はちょうど何かにはまり込むと同じことを行うために他の方法があります。 QActionはウィジェットではありませんので、私はUを与えたスタイルシートの最初の例ので)」それはあなたが望むものを、私が思うに似た何かを作る

'''An example file with a QAction that stays checkable.''' 

# IMPORT STANDARD LIBRARIES 
import sys 

# IMPORT THIRD-PARTY LIBRARIES 
from PyQt5.QtWidgets import QApplication 
from PyQt5.QtWidgets import QCheckBox 
from PyQt5.QtWidgets import QHBoxLayout 
from PyQt5.QtWidgets import QMenuBar 
from PyQt5.QtWidgets import QWidget 
from PyQt5.QtWidgets import QWidgetAction 



class CheckBox(QCheckBox): 

    def __init__(self, name): 
     super(CheckBox, self).__init__() 
     self.update_color() 
     self.setText(name) 

    def mousePressEvent(self, event): 
     self.update_color() 
     super(CheckBox, self).mousePressEvent(event) 

    def update_color(self): 
     if self.isChecked(): 
      self.setStyleSheet("color: gray;") 
     else: 
      self.setStyleSheet("") 

class WindowTest(QWidget): 

    '''A basic window.''' 

    def __init__(self, parent=None): 
     '''Init the window.''' 
     super(WindowTest, self).__init__(parent=parent) 
     self.setLayout(QHBoxLayout()) 
     self.menubar = QMenuBar(parent=self) 
     self.menu = self.menubar.addMenu('Some menu') 
     self.menu.setContentsMargins(10,10,10,10) 
     self.widget_action = QWidgetAction(self) 
     self.button = CheckBox("some") 
     self.button.setCheckable(True) 
     self.button.setFixedSize(100, 20) 
     self.widget_action.setDefaultWidget(self.button) 
     self.menu.addAction(self.widget_action) 
     self.setFixedSize(500,200) 


def main(): 
    '''Do the window test.''' 
    qapp = QApplication(sys.argv) 
    window = WindowTest() 
    window.show() 
    sys.exit(qapp.exec_()) 


if __name__ == '__main__': 
    main() 

を私が変更したコードのこの部分では、高速を見ては、欠陥を持っています私は実際にスタイルシートを変更することはできません(それは1つもありません)ので、他の人に影響を与えるメニュースタイルシートを変更しなければなりませんでした。 D

+0

QSSでウィジェットのクリック機能を無効にする方法はありますか? QActionのボタンをクリックしても色が変わっても、ボタンがクリック可能なので、色の変更は十分ではありません。 – ColinKennedy

+0

QActionではなく別のものを使って私の例を編集しました。必要に応じていつでも有効と無効を切り替えることができます。必要に応じて、アイテムを有効にしたり無効にしたりする際にアイテムを管理する必要があると思います。 – yurisnm

+0

あなたのステータスを希望通りに教えてください。チェックされている場合はクリックできますか?チェックされている場合は灰色か黒か?すべてのステータスケースは何ですか?あなたは私にそれを与えることができますので、私はあなたが探している行動をよりよく理解することができますか? – yurisnm

関連する問題