【问题标题】:Python/PyQt/Qt QMenu QAction syntaxPython/PyQt/Qt QMenu QAction 语法
【发布时间】:2017-11-06 09:00:08
【问题描述】:

我在使用 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[()] 段上生成'there is no matching overloaded signal' 错误。

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

action.triggered.connect(self.handler)

它现在似乎可以工作了。

有人能解释一下原始triggered[()] 语法的含义/工作原理,以及明显变化发生在哪个“产品”中——如果能够了解变化的地方会很好吗?我的替换是否只是 triggered 正确/相同的行为?

【问题讨论】:

    标签: python python-3.x pyqt qt5 pyqt5


    【解决方案1】:

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

    问题在于,某些信号(如 triggered)将始终发送默认布尔值,除非您采取措施消除它。 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...

    当然,如果您绝对确定您将永远连接将参数传递给triggeredclicked 之类的信号的插槽,您可以逃脱以上面显示的简单方式将它们全部连接起来。但是,真的,那只是一场等待发生的意外……

    【讨论】:

    • 是我希望得到的答案!您能否澄清什么(语法上)triggered[()] 的意思?我是 Python 新手。那是“() 的数组”吗??
    • @JonBrave。参数类型的元组用于选择您想要的特定重载。 () 是空元组,意思是:选择不带参数的重载。
    • @JonBrave。我可能应该补充一点,信号是实现__getitem__ method 的自定义 python 对象。它们在概念上更像dict(映射)而不是数组——尽管在某种程度上,python 的鸭子类型允许以几乎相同的方式处理它们。
    • 是否有诸如 PyQt-5.3 的文档链接之类的东西,它列举了这种行为变化?我可以通过寻找其他潜力来做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多