当前位置: 代码迷 >> QT开发 >> 急信号有关问题
  详细解决方案

急信号有关问题

热度:30   发布时间:2016-04-25 04:28:01.0
急!信号问题!
我定义了一个类

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>();
...
}
  相关解决方案