【发布时间】:2017-05-03 21:38:16
【问题描述】:
我想要一个行为稍有改变的 QAction。我希望 QAction 仅在检查时发出信号,并且我希望其复选框始终可检查,即使 QAction 已被禁用。例如,如果您将 QAction 设置为 setEnabled(False),则无法单击 QAction 或选中/取消选中它。我喜欢它不能再被点击,但不喜欢我不能切换 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()
【问题讨论】:
-
我可以知道它有什么用吗?也许我们可以为您的问题找出不同的解决方案,因为这听起来不像
QActions的预期行为。 -
是的,当然。基本上,我有一个应用程序,它有一个包含许多工具的菜单。有些工具有依赖关系,有些则没有。一些工具具有自动设置自己的依赖项,因此工具本身不需要每次都像其他工具一样按下才能运行。他们只需要加载/卸载一次。在他们没有任何运行时行为的情况下,我想要一种方法来打开/关闭依赖项,而无需实际运行 QAction 的单击功能,但也向用户显示(通常只是将其变灰或制作它不可点击)
-
你可以更好地解释我,你的问题很混乱。
-
您希望
QAction向什么样的事件发出信号? -
我将问题编辑为更清楚。不是信号的问题。默认情况下,我需要与 QAction 不同的行为。如果 QAction 被禁用,您不能单击它或选中/取消选中它的状态。即使它被禁用,我仍然需要能够选中/取消选中它