2017-04-24 32 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

我可以知道它有什么好处吗?也许我们可以找出针对您的问题的不同解决方案,因为这听起来不像预期的行为o f'QActions'。 – Matho

+0

是的,当然。基本上,我有一个应用程序有一个菜单,其中包含一些工具。一些工具具有依赖性,而另一些则不具有依赖性。一些工具具有自动设置自身的依赖关系,所以工具本身不需要像其他人一样每次都按下来运行。他们只需要加载/卸载一次。 在他们没有任何运行时行为的情况下,我想要一种方法来打开/关闭依赖关系,而不需要实际运行QAction的点击功能,但也向用户展示(通常只是通过灰色化或使其不可点击) – ColinKennedy

+0

你可以更好地解释我,你的问题很混乱。 – eyllanesc

回答

2

因为您希望能够点击QAction来检查和取消选中我不认为有必要禁用QAction。相反,你可以改变它的外观。 您是否尝试过使用样式表进行调试?

刚刚尝试在你的代码中添加这个简单的一行:

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

所以,我想在这里说的是,你可以根据你的意愿改变你的QAction的风格。

你也可以尝试一些更详细的和更具体的内容,上面的代码会将菜单中的每个文本都改为灰色,你可以指定想要更改字体颜色的对象类型等等,例如:

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

等等...

你可以尝试一些其他的方法来达到你想要的东西,有时候我们只是陷入的东西,还有其他的方式做同样的。在这一段代码,我修改了一个快速的外观,使类似的东西你想要什么,我想“)

'''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() 

由于样式表我把U的第一个例子中有一个缺陷,因为的QAction不是一个Widget所以我不能真正改变它的样式表(它没有),所以我不得不改变菜单样式表什么会影响其他人。第二个例子使用QCheckBox这是一个小部件,所以我可以专门改变它的样式表,我有更好的控制菜单上的每一项之上:D

+0

QSS中有一种方法可以禁用小部件的点击功能吗?也许你只是想举一个简单的例子,但颜色变化是不够的,因为QAction上的按钮仍然是可点击的,即使颜色改变了。 – ColinKennedy

+0

我刚刚使用另一件事物编辑我的示例,而不是QAction,这一个你可以随时启用和禁用。我认为在必要时启用和禁用它时应该有一些东西来管理您的物品。 – yurisnm

+0

告诉我你想要什么状态。如果检查是否可以点击?如果它被检查是灰色还是黑色?什么是状态案件。你能否给我这个,以便我更好地理解你在寻找什么样的行为? – yurisnm

相关问题