当 slot 函数具有默认参数=None 时,PySide2 的行为与 PySide 不同

Posted

技术标签:

【中文标题】当 slot 函数具有默认参数=None 时,PySide2 的行为与 PySide 不同【英文标题】:PySide2 doesn't behave like PySide when the slot function has a default argument=None 【发布时间】:2020-07-03 21:19:52 【问题描述】:

以下代码适用于 PySide,但不适用于 PySide2:

当触发操作 (Ctrl+S) 时,函数 saveResults 被调用为 filename=False,而不是 None,正如我所期望的那样(与 PySide 的情况一样:您可以通过切换导入来进行测试声明)。

我想知道行为是否发生了变化, 或者在我的代码中修复什么? (我知道我可以使用 lambda 技巧,我更好奇是 Slot 语法还是需要精度的连接)。

import sys

# PySide2 won't pop up the QFileDialog
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import Slot

# # PySide works fine:
# from PySide.QtGui import *
# from PySide.QtCore import Slot


class MyWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.fileMenu = self.menuBar().addMenu("&File")
        act = QAction("Save results...", self)
        act.triggered.connect(self.saveResults)  # <--- should call saveResults(None)
        #act.triggered.connect(lambda: self.saveResults(None))   # fixes the issue
        act.setShortcuts([QKeySequence.Save])
        self.fileMenu.addAction(act)

    @Slot()
    def saveResults(self, filename=None):
        print ('Calling saveResults, filename is', filename)
        if filename is None:
            (filename, selectedfilter) = QFileDialog.getSaveFileName(self,"Save results as ", ".", "NPY Files (*.npy);;Image files (*.png *.tif *.tiff *.bmp);;All files (*)")
            # ... exit if cancel clicked
        # finally save the file:
        print('Saving', filename)


qt_app = QApplication(sys.argv)
app = MyWindow()
app.show()
qt_app.exec_()

【问题讨论】:

【参考方案1】:

好像是个bug,解决方法是通过关键字触发连接:

# ...
self.fileMenu = self.menuBar().addMenu("&File")
act = QAction("Save results...", self, triggered=self.saveResults)
act.setShortcuts([QKeySequence.Save])
self.fileMenu.addAction(act)
# ...

【讨论】:

以上是关于当 slot 函数具有默认参数=None 时,PySide2 的行为与 PySide 不同的主要内容,如果未能解决你的问题,请参考以下文章

vue中的插槽slot理解

当带有 extract() 的 Scrapy 选择器返回 None 时如何设置默认值?

默认参数和函数指针作为函数参数C ++

Javascript - Jquery - 函数参数

当参数具有相同名称时如何恢复内置函数?

为啥当类包含任何参数化构造函数时编译器不提供默认构造函数? [复制]