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

2024-06-14 06:09:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当动作被触发时(Ctrl+S),函数saveResultsfilename=False调用,而不是像我预期的那样None(PySide的情况是:可以通过切换导入语句进行测试)

我想知道行为是否发生了变化,
或者我的代码中要修复的东西? (我知道我可以使用lambda技巧,我更好奇的是插槽语法还是连接需要精确性)

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_()


Tags: thelambda代码fromimportselfnoneapp
1条回答
网友
1楼 · 发布于 2024-06-14 06:09:16

这似乎是一个bug,解决方法是通过关键字触发连接:

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

相关问题 更多 >