QT 有个强大的 信号槽机制,他的信号槽怎么关联起来,就通过这个connect。一下是个人在学习过程中遇到的几个问题,记录一下
一
问题描述:
今天在编译的时候发现报错:
error: no matching function for call to 'keyBoardForm::connect(keyBoardForm* const, const char*, inputMethod*&, const char*)'
原因分析:
下面看一下connect的参数规则:
connect 的调用方法: connect(信号发送者的指针, SIGNAL(信号), 信号接收者指针, SLOT(槽---信号处理函数));
我的第一反应是 域名污染引起的, 真土! 出现这种情况的原因一般都是 connect 的信号接收者和 发送者没用定义。
后来排查发现真的 是接收者的头文件没有引用,这里做个记录。也奇怪,头文件缺失竟然报这种错误!
解决方法:
引用缺失的头文件。
网上有类似的问题,有个哥们也遇到这样的问题,这里也记一下:
error: no matching function for call to 'MainWindow::connect(*&, ...)
强制类型转换一下:
connect((QObject*)(sender),...);
二
问题描述:
本人在一个 qt 程序中,这样定义了一个信号和槽的连接,但运行时没反应,提示 treeView_xmlb 没有信号 itemDoubleClicked(), 真纳闷 ,明明是有这个信号的?
代码如下:
suggestion::suggestion(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
ui.setupUi(this);
mode_suggestion = new QSqlTableModel(ui.tableView_suggestion);
connect(ui.treeWidget_xmlb, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(showSubItem(QTreeWidgetItem*, int)));
//设置树形表
ui.treeWidget_xmlb->setColumnCount(1); //设置列数
ui.treeWidget_xmlb->setHeaderLabel(tr("体检项目类别")); //设置头的标题
}
原因分析:
在网上找解决方法,无果,这个问题要么很深,要么很浅,后来将代码修改为如下
suggestion::suggestion(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
ui.setupUi(this);
mode_suggestion = new QSqlTableModel(ui.tableView_suggestion);
//connect(ui.treeWidget_xmlb, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(showSubItem(QTreeWidgetItem*, int)));
//设置树形表
ui.treeWidget_xmlb->setColumnCount(1); //设置列数
ui.treeWidget_xmlb->setHeaderLabel(tr("体检项目类别")); //设置头的标题
connect(ui.treeWidget_xmlb, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(showSubItem(QTreeWidgetItem*, int)));
}
问题解决,所以建议connect 还是要放在构造函数的最后。
解决方法:
将connect 放在构造函数的最后