gpt4 book ai didi

python - PyQt - 使 QAction 可检查,即使它被禁用

转载 作者:太空狗 更新时间:2023-10-29 21:09:26 24 4
gpt4 key购买 nike

我想要一个行为略有改变的 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()

最佳答案

因为您仍然希望能够在 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()

因为我给你的样式表的第一个例子有一个缺陷,因为 QAction 不是一个小部件所以我不能真正改变它的样式表(它没有)所以我不得不改变菜单样式表会影响什么其他所有人。第二个示例使用 QCheckBox,它是一个小部件,因此我可以专门更改其样式表,并且我可以更好地控制菜单中的每个项目:D

关于python - PyQt - 使 QAction 可检查,即使它被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43596710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com