我定义了一个类
- C/C++ code
class A{ // ...... private: QString m_strName;};typedef QList<A> LISTA;class B{ // ....private: LISTA m_listA;}
然后又一个信号,其参数是类 B
- C/C++ code
signals: void mySignal( const B& b );
运行程序弹出错误:QObject::connect: Cannot queue arguments of type 'B'
(Make sure 'B' is registered using qRegisterMetaType().)
然后我在 main 函数中添加注册代码:
- C/C++ code
qRegisterMetaType<A>( "CLASS_A" );qRegisterMetaType<LISTA>( "LIST_A" );qRegisterMetaType<B>( "CLASS_B" );
但是运行还是报同样的错,请问该怎么做?
------解决方案--------------------
信号槽连接,前提是类要从QObject继承
class MyClass : public QObject(或QtGui类)
{
Q_OBJECT
//........
};
------解决方案--------------------
A B继承自QObject
记得带Q_OBJECT宏
------解决方案--------------------
qRegisterMetaType<A>( "A" );
qRegisterMetaType<B>( "B" );
应该这样写, 不需要加CLASS_
------解决方案--------------------
为啥会和QObject没关系呢? Signal slot机制 需要meta信息。如果没有QObject Q_OBJECT, MetaObject Compiler不会产生meta信息的.
------解决方案--------------------
用qRegisterMetaType或让你的类继承自 QObject 这是Qt的标准做法,如果不行就是其他地方有问题了
------解决方案--------------------
class Block
{
public:
Block();
Block(const Block &other);
~Block();
Block(const QRect &rect, const QColor &color);
QColor color() const;
QRect rect() const;
private:
QRect m_rect;
QColor m_color;
};
Q_DECLARE_METATYPE(Block);
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qRegisterMetaType<Block>();
...
}