为什么我用自定义对话框获得“QMetaObject :: connectSlotsByName:No matching signal”?

时间:2017-09-20 14:24:21

标签: c++ qt qt5 qt-signals

我正在使用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. 使用finished()代替。

  2. &m_name_dialog投射到QDialog *

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

  4. 提前致谢。

1 个答案:

答案 0 :(得分:4)

在代码的某些部分,您使用方法connectSlotsByName,如果您创建了一个设计( .ui ),这通常会调用它,因为编译会生成一个文件{{1} },并使用此文件。

根据docs

  

void QMetaObject :: connectSlotsByName(QObject * object)

     

以递归方式搜索给定对象的所有子对象,以及   将来自它们的匹配信号连接到跟随的对象的插槽   以下表格:

     

ui_somefile.h

从上面可以看出,这种方法将尝试连接具有该格式的插槽,并且在您的情况下第二个插槽满足它,当尝试连接它时查找对象和信号,但在您的情况下它确实找不到它,因为该对象不存在void on_<object name>_<signal name>(<signal parameters>);并生成您看到的警告。

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

注意:

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