为什么我可以通过自定义对话框获得"QMetaObject::connectSlotsByName: No matching signal"?



我正在使用qt5。

我有一个非常简单的对话框类,该类从qdialog继承。

我有一个使用此对话框的类,还有一个qfiledialog:

    NameDlg       m_name_dlg;
    QFileDialog   m_file_dlg;

此课程还具有一些可以处理对话框关闭的插槽:

private slots:
    void on_dlgName_accepted();
    void on_FileDlgClosed(int result);

在构造函数中,我进行了一些连接:

QObject::connect(&m_file_dlg, SIGNAL(finished(int)),
                 this, SLOT(on_FileDlgClosed(int)));
QObject::connect(&m_name_dlg, SIGNAL(accepted()),
                 this, SLOT(on_dlgName_accepted()));

连接的第一个呼叫很好,但是第二个调用会生成输出:

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

奇怪的是,当接受名称对话框时,我的插槽被正确调用了!

Qdialog的文档(和标题文件)说:

Signals
    void accepted()

所以它不是参数不匹配。

正如我上面说的那样,信号被正确地调用,所以我的代码都可以正常工作,我真的很想理解为什么我会得到这种警告(作为一种教育练习)并摆脱它(为了平安)。

我不能发布完整的代码,但我确实相信任何人应该足以理解问题。

我尝试过的事情:

  1. 使用完成()代替。

  2. &m_name_dialog铸造为QDialog *

  3. 将信号更改为 QDialog::accepted()

预先感谢。

在代码的某些部分中,您使用的是方法connectSlotsByName,如果您创建了一个设计( .UI ),这通常是称为它的,因为编译汇编生成文件,ui_somefile.h,并且使用此文件。

根据文档:

void qmetaObject :: connectslotsbyname(qobject *object)

递归搜索给定对象的所有子对象,并且 将它们的匹配信号连接到遵循的对象插槽 以下表格:

void on_<object name>_<signal name>(<signal parameters>);

从上面可以观察到,该方法将尝试连接具有该格式的插槽,在您的情况下,第二个插槽在尝试连接时会符合它,以查找对象和信号,但是在您的情况下,它确实可以由于对象不存在dlgName,因此找不到它。

此方法是由.UI文件创建的,因为通过设计,您可以通过右键单击窗口小部件并选择转到slot ,选择信号并最终创建插槽。


注意:

如果您要创建自己的插槽,避免使用下划线,因为这可能会导致您问题,因为QT会尝试将其连接起来,如果对象不存在,它将向您发送多个警告。

相关内容

  • 没有找到相关文章

最新更新