gpt4 book ai didi

python - PySide:QMetaObject.connectSlotsByName 发出警告 "No matching signal..."但仍然有效..?

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:13 24 4
gpt4 key购买 nike

在 Qt Designer 中,我创建了一个 QDialog 窗口并使用 pysideuic 将其编译为一个基类,该基类包含一个 setupUi 方法来初始化所有GUI 元素,我对其进行扩展以实现功能,如下所示:

class MyDialog(QtGui.QDialog, ui_file.Ui_main_dialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
ui_file.Ui_main_dialog.__init__(self)
self.setupUi(self)

setupUi 方法调用了 QtCore.QObject.connect,用于我在 Qt Designer 中创建的信号槽连接,我还在其中向 GUI 添加了新槽。这些插槽在 pysideuic 生成的基类中不存在,我将它们添加到 MyDialog 类中,例如

    def on_list_selection_changed(self):
self.run_btn.setEnabled(len(self.modules_list.selectedIndexes()) > 0)

对于此示例,槽在 Qt Designer 中被称为 on_list_selection_changed()(带有空参数列表)。

初始化时,MyDialog.__init__ 调用 Ui_main_dialog.setupUi,它最终调用 QtCore.QMetaObject.connectSlotsByName(后两者带有 MyDialog 实例的 self 当前正在创建)。这会在 sys.stderr 上发出以下行:

QMetaObject::connectSlotsByName: No matching signal for on_list_selection_changed()

尽管如此,当连接 modules_list.itemSelectionChanged()(modules_list 是一个 QListWidget)时,信号仍然正确运行并且调用槽。

所以这是我的问题:为什么我会收到此警告?鉴于它似乎无关紧要,我该怎么做才能让它不出现?


编辑:由于我在过去 5 个月内没有收到任何答案,我想我给出了一个完整的示例,以便更容易地重现问题。

这个例子与上面的问题不同,它只使用了一个QLineEdit实例。这是代码:

import sys
from PySide import QtCore, QtGui

class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
self.lineEdit = QtGui.QLineEdit(Dialog)
self.lineEdit.setObjectName("lineEdit")
QtCore.QObject.connect(self.lineEdit, QtCore.SIGNAL("textChanged(QString)"), Dialog.on_lineEdit_changed)
QtCore.QMetaObject.connectSlotsByName(Dialog)

class MainWindow(QtGui.QMainWindow, Ui_Dialog):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
Ui_Dialog.__init__(self)
Ui_Dialog.setupUi(self, self)
@QtCore.Slot(unicode) # signal with no arguments
def on_lineEdit_changed(self, text):
print 'Changed to', text

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())

请注意,Ui_Dialog 类的代码是由 Qt Designer 的 .ui 文件中的 pysideuic 生成的,但我将其缩短了一点以更好地突出问题。

最佳答案

我在 C++ 中遇到了同样的问题。 connectSlotsByName 被硬编码为在找到无法自动连接的插槽时输出该消息,即使您不需要自动连接,因为您已经明确地自己完成了。您可以使用 qInstallMsgHandler 来抑制一般警告或将消息写在更好的地方,但我认为没有任何方法可以告诉 connectSlotsByName 您不特别关心这种情况。

关于python - PySide:QMetaObject.connectSlotsByName 发出警告 "No matching signal..."但仍然有效..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16460421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com