我正在使用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()
所以它不是参数不匹配。
正如我上面说的那样,信号被正确地调用,所以我的代码都可以正常工作,我真的很想理解为什么我会得到这种警告(作为一种教育练习)并摆脱它(为了平安)。
我不能发布完整的代码,但我确实相信任何人应该足以理解问题。
我尝试过的事情:
使用完成()代替。
将
&m_name_dialog
铸造为QDialog *
。将信号更改为
QDialog::accepted()
。
预先感谢。
在代码的某些部分中,您使用的是方法connectSlotsByName
,如果您创建了一个设计( .UI ),这通常是称为它的,因为编译汇编生成文件,ui_somefile.h
,并且使用此文件。
根据文档:
void qmetaObject :: connectslotsbyname(qobject *object)
递归搜索给定对象的所有子对象,并且 将它们的匹配信号连接到遵循的对象插槽 以下表格:
void on_<object name>_<signal name>(<signal parameters>);
从上面可以观察到,该方法将尝试连接具有该格式的插槽,在您的情况下,第二个插槽在尝试连接时会符合它,以查找对象和信号,但是在您的情况下,它确实可以由于对象不存在dlgName
,因此找不到它。
此方法是由.UI文件创建的,因为通过设计,您可以通过右键单击窗口小部件并选择转到slot ,选择信号并最终创建插槽。
注意:
如果您要创建自己的插槽,避免使用下划线,因为这可能会导致您问题,因为QT会尝试将其连接起来,如果对象不存在,它将向您发送多个警告。