从Qt5.3回到Qt4.8,有Q_DECLARE_METATYPE问题

Moving back from Qt5.3 to Qt4.8, having Q_DECLARE_METATYPE issues

本文关键字:DECLARE METATYPE 问题 3回 Qt5 Qt4      更新时间:2023-10-16

由于我的工作要求,我不得不从Qt5.3恢复到Qt4.8,除了一些功能更改外,一切都很顺利,除了我得到了QMetaProperty::read: Unable to handle unregistered datatype错误。有人遇到过这种情况吗?我很困惑,我不知道从哪里开始。据我所知,Q_DECLARE_METATYPE在Qt4.8中是一个有效的宏,其工作方式相同。我没有改变任何include或任何东西

下面的代码在Qt 4和Qt 5中工作相同。我不确定您做错了什么—如果没有看到一些代码,很难从大量混乱中想象出一个原因。你必须承认,"我刚刚在Qt 5中写了一堆代码,但它在Qt 4中不起作用"有点模糊。

#include <QtCore>
struct T {};
class C : public QObject {
   Q_OBJECT
   Q_PROPERTY(QList<T*> stuff READ stuff)
   QList<T*> m_stuff;
public:
   C(QObject * parent = 0) : QObject(parent) { m_stuff << (T*)10 << (T*)11; }
   Q_SIGNAL void aSignal(const QList<T*>&);
   Q_SLOT void aSlot(const QList<T*>& data) {
      m_stuff = data;
   }
   QList<T*> stuff() const {
      return m_stuff;
   }
};
Q_DECLARE_METATYPE(QList<T*>)
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   qRegisterMetaType<QList<T*> >();
   C c;
   c.connect(&c, SIGNAL(aSignal(QList<T*>)), SLOT(aSlot(QList<T*>)), Qt::QueuedConnection);
   // Test reading a property
   QMetaProperty p = c.metaObject()->property(c.metaObject()->indexOfProperty("stuff"));
   auto s = p.read(&c).value<QList<T*> >();
   Q_ASSERT(s == c.stuff());
   // Test queued signal-slot connection
   auto const data = QList<T*>() << (T*)1 << (T*)2;
   emit c.aSignal(data);
   a.processEvents();
   Q_ASSERT(data == c.stuff());
   return 0;
}
#include "main.moc"