c++ - 为什么使用自定义对话框会得到 "QMetaObject::connectSlotsByName: No matching signal"?

标签 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()));

第一次调用 connect 没问题,但第二次调用生成输出:

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

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

QDialog 的文档(和头文件)说:

Signals
    void accepted()

所以这不是参数不匹配。

正如我上面所说的,信号被正确调用所以我的代码一切正常,我真的很想知道为什么我会收到这个警告(作为教育练习)并摆脱它(为了安心).

我不能发布完整的代码,但我相信应该有足够的代码让任何人都能理解这个问题。

我尝试过的事情:

  1. 改为使用 finished()。

  2. &m_name_dialog 转换为 QDialog *

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

提前致谢。

最佳答案

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

根据docs :

void QMetaObject::connectSlotsByName(QObject *object)

Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form:

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

从上面可以看出,此方法将尝试连接具有该格式的插槽,在您的情况下,第二个插槽会满足它,当尝试连接时,它会查找对象和信号,但在您的情况下会找不到它,因为该对象不存在 dlgName并生成您看到的警告。

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


注意:

如果您要创建自己的槽,避免使用下划线,因为这可能会给您带来问题,因为 Qt 会尝试连接它,如果对象不存在,它会向您发送多个警告.

关于c++ - 为什么使用自定义对话框会得到 "QMetaObject::connectSlotsByName: No matching signal"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324689/

相关文章:

python - 将 QListView 与 Pyside 中定义的模型一起使用

c++ - QResizeEvent 导致 SIGSEGV

Qt5 "Attempt to set a screen on a child window"许多运行时警告消息

c++ - 如何读取/重定向 dos 命令的输出到 C/C++ 中的程序变量?

C++打开文件似乎在运行后破坏了文件

c++ - QT如何连接VLC播放器

c++ - 主对话框关闭后关闭对话框

c++ - "plugin verification data mismatch"while loading plugin for qt5 project

c++ - 开源项目中的未知类型名称

c++ - Qt 5.2 中如何获取联系人列表。