gpt4 book ai didi

Python/PyQt/Qt QMenu QAction 语法

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:10 25 4
gpt4 key购买 nike

我在使用 Python 3、PyQt5 和 Qt5 的应用程序中遇到语法/理解问题。我不确定是哪一个导致了问题。

我负责将一个在 Windows 下工作的 GUI 应用程序移植到 Linux,并使用更新版本的库。我无法访问在 Windows 下运行的原始版本。

我在几个地方看到:

menu = QMenu(self)
action = menu.addAction("Some string")
action.triggered[()].connect(self.handler)

我想这曾经有效。我正在移植到 Python 3.5、PyQt 5.7 和 Qt 5.7。我有理由相信代码是为其中每一个的早期版本编写的。

现在执行它会在 action.triggered[()] 段上生成一个 '没有匹配的重载信号' 错误。

通过猜测和查看我在某处找到的几个示例,我将最后一行更改为:

action.triggered.connect(self.handler)

它现在似乎可以工作了。

有人可以解释一下原始的 triggered[()] 语法是什么意思/有效吗,以及明显的变化是在哪个“产品”中——如果能够阅读有关内容,那就太好了这个改了吗我的替换是否只是 triggered 正确/相同的行为?

最佳答案

相关变化发生在 PyQt-5.3 中。简单地删除旧语法是完全安全的,因为这很容易在当前和 future 的代码中产生一个微妙的错误。

问题是某些信号如 triggered 将始终发送默认 bool 值,除非您采取措施消除它。 Qt 像这样定义这些信号:

    triggered(bool checked = false)

PyQt 之前将其实现为两个重载:

    triggered(bool checked)
triggered()

如果您想显式选择后一个重载,则必须使用以下有点笨拙的语法:

    triggered[()].connect(slot)

但这现在不再是一个选项,因为只实现了第一个重载。所以要获得完全相同的行为,有必要像这样包装处理程序:

    triggered.connect(lambda checked: slot())

或者这样装饰它:

    @QtCore.pyqtSlot()
def handleTriggered(self):
pass

否则,很容易落入小圈套。假设您有一个这样定义的方法:

    def frobnicate(self, foobar=True):
if foobar:
# do something nice
else:
# empty my home directory without prompting

稍后,您决定将它连接到一个按钮,如下所示:

    self.button.clicked.connect(self.frobnicate)

这一切看起来都很好,直到您发现 clicked 信号就像 triggered 一样工作,并且默认情况下始终发送 False。 ..

当然,如果您绝对确定永远不会连接将参数带入triggered信号的插槽单击,您可以按照上面显示的简单方式将它们全部连接起来。但是,实际上,这只是一个等待发生的事故......

关于Python/PyQt/Qt QMenu QAction 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371451/

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