当前位置: 首页 > 面试题库 >

信号和缺少位置参数

段干德泽
2023-03-14
问题内容

我在QtDesigner中开发了两个窗口(SourceForm,DestinationForm),并使用pyuic5转换了它们的.ui页面。我使用第三类WController作为一种使用堆叠式小部件在两个窗口之间导航的方法。我有一个按钮,SourceForm其中填充treeWidget了一些数据,该方法handle_treewidget_itemchange指示treeWidget使用选中或取消选中其中的特定项目时会发生什么self.treeWidget.itemChanged.connect(self.handle_treewidget_itemchange)。我的理解是,itemChanged.connect会自动将更改后的行和列发送到插槽,但是当handle_treewidget_itemchange(self,row,col)第一次调用该脚本时,我的脚本因TypeError崩溃:

TypeError: handle_treewidget_itemchange() missing 2 required positional arguments: 'row' and 'col'

如果我取出rowcolargs,脚本运行正常。当我最初在SourceForm.py文件中同时拥有方法和调用时,我的代码按预期工作了……也许这只是范围问题?我开始认为尝试使用PyQt却还没有Python经验是一个坏主意:(

我试图将代码简化为基本要素:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import pyqtSlot
from imp_sourceform import Ui_SourceForm
from imp_destform import Ui_DestinationForm


class WController(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(WController, self).__init__(parent)
        self.central_widget = QtWidgets.QStackedWidget()
        self.setCentralWidget(self.central_widget)

        self.sourcewindow = SourceForm()
        self.destinationwindow = DestinationForm()

        self.central_widget.addWidget(self.sourcewindow)
        self.central_widget.addWidget(self.destinationwindow)

        self.central_widget.setCurrentWidget(self.sourcewindow)

        self.sourcewindow.selectdestinationsbutton.clicked.connect(lambda: self.navigation_control(1))
        self.destinationwindow.backbutton.clicked.connect(lambda: self.navigation_control(0))

    def navigation_control(self, topage):
        if topage == 1:
            self.central_widget.setCurrentWidget(self.destinationwindow)
        elif topage == 0:
            self.central_widget.setCurrentWidget(self.sourcewindow)

class SourceForm(QtWidgets.QWidget, Ui_SourceForm):
    def __init__(self):
        super(SourceForm, self).__init__()
        self.setupUi(self)

        self.treeWidget.itemChanged.connect(self.handle_treewidget_itemchange)

    @pyqtSlot()
    def handle_treewidget_itemchange(self,row,col): 
        if row.parent() is None and row.checkState(col) == QtCore.Qt.Unchecked: 
            for x in range(0,row.childCount()):
                row.child(x).setCheckState(0, QtCore.Qt.Unchecked)
        elif row.parent() is None and row.checkState(col) == QtCore.Qt.Checked:
            for x in range(0,row.childCount()):
                row.child(x).setCheckState(0, QtCore.Qt.Checked)
        else:
            pass

class DestinationForm(QtWidgets.QWidget, Ui_DestinationForm):
    def __init__(self):
        super(DestinationForm, self).__init__()
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = WController()
    window.show()
    sys.exit(app.exec_())

问题答案:

使用时需要小心pyqtSlot,因为很容易破坏正在装饰的插槽的签名。在您的情况下,它已将插槽重新定义为没有参数,这解释了为什么您收到该错误消息。简单的解决方法是简单地删除它,因为如果没有它,您的示例也可以很好地工作。

的主要目的pyqtSlot是允许定义插槽的几个不同的重载,每个重载都具有不同的签名。进行跨线程连接时,有时也可能需要使用它。但是,这些用例相对较少,在大多数PyQt
/ PySide应用程序中,根本不需要使用pyqtSlot。信号可以连接到 任何 python可调用对象,无论它是否被装饰为插槽。



 类似资料:
  • 问题内容: 我正在开发一个游戏作为附带项目,很有趣,但是遇到了这个错误,我真的不知道为什么会发生… 这是代码: 我这样称呼它: 我得到的错误是: 有任何想法吗? 问题答案: 您不应直接调用类方法,而应创建该类的实例: 要详细说明该错误,您将得到: TypeError:turn()缺少1个必需的位置参数:“ playerImages” 这是因为需要第一个参数()的实例。类方法总是将实例作为第一个参数

  • 问题内容: 我收到以下错误: 问题答案: 您的班级有两个参数,但是在您调用时; 您没有写任何参数。因此,您必须提出两个可能的论点。

  • 我无法通过错误: 我检查了几个教程,但似乎没有什么不同于我的代码。我唯一能想到的是Python3.3需要不同的语法。 如果我理解正确,会自动传递给构造函数和方法。我做错了什么?

  • 问题内容: 我是python新手,碰壁了。我遵循了一些教程,但无法克服错误: 我检查了一些教程,但似乎与我的代码没有什么不同。我唯一能想到的是python 3.3需要不同的语法。 主要技巧: 泵类: 如果我正确理解,“自我”将自动传递给构造函数和方法。我在这里做错了什么? 我正在将Windows 8与python 3.3.2一起使用 问题答案: 你需要在此处实例化一个类实例。 采用 小例子

  • 我尝试在谷歌中找到解决方案,但谷歌中的所有解决方案都不适合我,也许在这里我得到了正确的答案。 我有以下代码: 我得到了这个错误: 回溯(最后一次调用):文件“位置文件”,第42行,在g=gui_main()文件“位置文件”的第26行,在init btn_next=按钮(self.win_about,text=“next”,fg=“red”,command=gui_main.screen_menu(

  • 我是matplotlib的新手,我试图将文本设置为图形中的一个点,但我有错误: Traceback(最近一次调用):文件main.py,第239行,在main()文件main.py,第232行,在mainp.show_graphic_ortg_drtg()文件/home/josecarlos/Workspace/python/进程/process.py,第363行,show_graphic_ort

  • 我对Python非常陌生,现在我有了第一个真正的问题:我想写一个电子邮件程序,但是我不能使用类来发送邮件。我看到了很多这些错误的答案,但没有一个真正适合我。以下是代码: PS:很抱歉我的英语不好,我是一名德国学生,这就是为什么所有变量和类的名称都是用德语写的,希望这不是问题:)

  • 我正在学习python。我创建了一个包含2个方法的类可视化工具。现在我想在第二个方法中调用第一个方法。我读到我必须使用self: 这很有效。现在我添加了其他参数: 我从我的调用它: 现在我得到一个错误: 我检查了,参数3在那里,参数序列是相同的。我认为它与自我冲突。 我怎样才能解决这个问题?我的类中是否需要init方法? 编辑:在我的主页上: