为什么使用自定义对话框会得到 "QMetaObject::connectSlotsByName: No matching signal"?
Why do I get "QMetaObject::connectSlotsByName: No matching signal" with a custom dialog?
我正在使用 Qt5。
我有一个非常简单的对话框 class,它继承自 QDialog。
我有一个使用这个对话框的 class,还有一个 QFileDialog:
NameDlg m_name_dlg;
QFileDialog m_file_dlg;
这个 class 也有一些插槽来处理对话框关闭:
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()
所以这不是参数不匹配。
正如我上面所说,信号被正确调用所以我的代码一切正常,我真的很想知道为什么我会收到这个警告(作为教育练习)并摆脱它(为了和平思想)。
我无法 post 完整的代码,但我相信应该有足够的代码让任何人都能理解这个问题。
我尝试过的事情:
改用 finished()。
正在将 &m_name_dialog
转换为 QDialog *
。
正在将信号更改为 QDialog::accepted()
。
提前致谢。
如果您创建了一个设计 (.ui),那么在您的代码的某些部分中您正在使用方法 connectSlotsByName
,这通常会调用它因为编译生成了一个文件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 会尝试连接它,如果对象不存在的话会给你发送几个警告。
我正在使用 Qt5。
我有一个非常简单的对话框 class,它继承自 QDialog。
我有一个使用这个对话框的 class,还有一个 QFileDialog:
NameDlg m_name_dlg;
QFileDialog m_file_dlg;
这个 class 也有一些插槽来处理对话框关闭:
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()
所以这不是参数不匹配。
正如我上面所说,信号被正确调用所以我的代码一切正常,我真的很想知道为什么我会收到这个警告(作为教育练习)并摆脱它(为了和平思想)。
我无法 post 完整的代码,但我相信应该有足够的代码让任何人都能理解这个问题。
我尝试过的事情:
改用 finished()。
正在将
&m_name_dialog
转换为QDialog *
。正在将信号更改为
QDialog::accepted()
。
提前致谢。
如果您创建了一个设计 (.ui),那么在您的代码的某些部分中您正在使用方法 connectSlotsByName
,这通常会调用它因为编译生成了一个文件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 会尝试连接它,如果对象不存在的话会给你发送几个警告。