QT 信号与槽connect
2015-07-17 10:50
477 查看
QT 信号与槽connect
QT 信号与槽connectconnect函数调用几个限制connect函数代码QT中信号与槽的连接使用的connect函数是一个静态函数,在类
QObject中定义。这里说的是
QT5环境下。更详细的介绍可以看这里http://www.devbean.net/2012/12/how-qt-signals-and-slots-work-qt5/本文由乌合之众 lym瞎编,欢迎转载
blog.cnblogs.net/oloroso本文由乌合之众 lym瞎编,欢迎转载
my.oschina.net/oloroso
connect函数调用几个限制
1. 信号的发送者必须是QObject的派生类对象。不然会出现
error: invalid conversion from 'XXX*' to 'const QObject*' [-fpermissive]...的错误。2. 回调槽函数的对象必须是
QObject的派生类对象。不然会出现
error: no matching function for call to 'QObject::connect(XXX*,的错误。这里要注意一点,信号函数无论存在与否,都不会报错的。但是如果信号的发送者是
NULL,那么会在运行的时候提示
QObject::connect: Cannot connect (null)::信号函数() to 接收者::槽函数()的问题。对于
1,2两点,在
connect函数调用的时候强转类型也可以通过编译,但是运行的时候会提示
No such slot QObject::的问题。3. 槽函数所在的类的定义中必须添加宏
Q_OBJECT,不然会出现
QObject::connect: No such slot ...的错误。这里必须和第
2点联系起来,如果添加了
Q_OBJECT宏的类不是从
QObject派生的,
moc生成中间文件的时候会报错
Error: Class contains Q_OBJECT macro but does not inherit from QObject。如果添加了
Q_OBJECT宏之后编译出现了
undefined reference to ‘vtable for...的错误,请删除
build目录下的
Makefile文件,再重新生成。4. 信号函数的
signals修饰和槽函数的
slots修饰其实是必须的。虽然生成的中间代码中会去除掉。
问题 | 原因 |
---|---|
error: no matching function for call to 'QObject::connect(XXX*, | 信号的发送者和接受者必须是QObject的派生类对象。 |
QObject::connect: No such slot ... | 满足面的条件后,还必须满足槽函数所在类的定义中添加(使用)了Q_OBJECT宏 |
Error: Class contains Q_OBJECT macro but does not inherit from QObject | 添加了Q_OBJECT宏的类不是从 QObject派生的 |
undefined reference to ‘vtable for... | 这是在添加了Q_OBJECT宏之后编译出现,原因是没有更新 Makefile文件。请删除 build目录下的 Makefile文件,再使用 qmake重新生成。 |
connect函数代码
connect是一个模板函数,但是对参数的类型是有要求的。这个函数的返回值是QMetaObject::Connection类型的。
//Connect a signal to a pointer to qobject member function
//连接一个信号到 qobject 成员函数的指针template <typename Func1, typename Func2>
static inline QMetaObject::Connection connect(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender,
Func1 signal,
const typename QtPrivate::FunctionPointer<Func2>::Object *receiver,
Func2 slot,Qt::ConnectionType type = Qt::AutoConnection
)
{
typedef QtPrivate::FunctionPointer<Func1> SignalType;
typedef QtPrivate::FunctionPointer<Func2> SlotType;//检查信号类是否有Q_OBJECT宏
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
"No Q_OBJECT in the class with the signal");//compilation error if the arguments does not match.
//如果参数不匹配的编译错误。
//槽函数需要的参数比信号函数提供多。
Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
"The slot requires more arguments than the signal provides.");
//信号函数和槽函数的参数不是兼容的。
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
"Signal and slot arguments are not compatible.");
//信号函数返回类型是槽函数的不兼容的返回类型。
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value),
"Return type of the slot is not compatible with the return type of the signal.");const int *types = 0;
if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();//QObject::connectImpl是用于执行连接的私有内部函数。
//槽函数的包装器,用于辅助调用该槽函数。
return connectImpl(sender, reinterpret_cast<void **>(&signal),
receiver, reinterpret_cast<void **>(&slot),
new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value,
typename SignalType::ReturnType>(slot),
type, types, &SignalType::Object::staticMetaObject);
}
相关文章推荐
- qt5 mouseless 多种部件切换带焦点高亮显示
- PyQt实战之计算器的实现
- Qt笔记——MOC(莫克)
- (一) Qt Model/View 的简单说明
- Qt连接Sql server错误ConnectionOpen (Connect()). QODBC3: Unable to connect"
- pyQt不同窗体间的值传递(二)——使用信号槽机制
- Qt通过ODBC来操作Excel
- Visual Studio下Qt调用IDL
- ubuntu下QT与opencv的配置安装
- QT POST/GET 发送/获取网页数据
- qt5 mouseless 多子页面切换测试
- Qt5 mouseless 测试
- Qt数据库:(一)简介
- win8 64bit/win7 32bit/winxp 32bit +QT+opencv环境配置教程,亲测成功
- ArcGIS QT开发:ArcGIS Runtime dll不能被QT识别问题
- mac osx上为qt应用生成debug symbol
- qt中qDebug()无法输出解决办法
- Qt读写INI配置文件
- Qt下 QString转char*
- QT 应用程序自动重启