python - 当 slot 函数具有默认参数=None 时,PySide2 的行为与 PySide 不同
问题描述
下面的代码适用于 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_()
解决方案
这似乎是一个错误,解决方法是通过关键字触发连接:
# ...
self.fileMenu = self.menuBar().addMenu("&File")
act = QAction("Save results...", self, triggered=self.saveResults)
act.setShortcuts([QKeySequence.Save])
self.fileMenu.addAction(act)
# ...
推荐阅读
- python - PyLint W0143 警告:与可调用对象进行比较
- javascript - 为什么从 div 扩展的自定义元素在样式方面不像 div
- spring - Spring自定义查询转义:
- javascript - 同时加载多个图像
- r - R shiny - 用户定义的函数在 mainPanel 中打印
- oracle - 如何在 Docker 中连接到外部 Oracle 数据库
- php - 如何在 Symfony Messenger 的中间件上禁用日志“信息”?
- algorithm - 如何使用机器学习计算文本中的单词
- javascript - 如何通过特定对象键对数组中的值求和?
- python - 使用 PyTorch LSTM,我的 hidden_size 可以与 input_size 不同吗?