gpt4 book ai didi

c++ - 将 Qt 属性与命名空间中定义的自定义类型一起使用

转载 作者:太空狗 更新时间:2023-10-29 20:42:07 29 4
gpt4 key购买 nike

我目前在使用自己的类型作为属性类型时遇到问题。

我的自定义类型是在命名空间中定义的。当我将它放入全局命名空间时,一切正常,没有任何问题。

是否可以在命名空间中使用自定义类型作为属性值?

这是一个最小的例子(我使用的是 Qt5.0 和 g++ 4.7.3)

这是 test.pro 文件:

LANGUAGE  = C++
QT += core gui widgets
TARGET = test
QMAKE_CXXFLAGS += -std=c++11
HEADERS += test.h
SOURCES += test.cpp

这是 test.h 文件:

#include <QtCore>
#include <QtGui>
#include <QtWidgets>

namespace MyNamespace
{
struct MyValue
{
private:
QString a;
int b;

public:
MyValue(const QString &a="", int b=0)
: a(a), b(b)
{
}

bool operator !=(const MyValue &other) const
{
return (this->a!=other.a) || (this->b!=other.b);
}

friend QDataStream &operator<<(QDataStream &stream, const MyNamespace::MyValue &value);
friend QDataStream &operator>>(QDataStream &stream, MyNamespace::MyValue &value);
friend QDebug operator<<(QDebug debug, const MyNamespace::MyValue &value);
};

inline QDataStream &operator<<(QDataStream &stream, const MyNamespace::MyValue &value)
{
stream << value.a;
return stream << value.b;
}

inline QDataStream &operator>>(QDataStream &stream, MyNamespace::MyValue &value)
{
stream >> value.a;
return stream >> value.b;
}

inline QDebug operator<<(QDebug debug, const MyNamespace::MyValue &value)
{
return debug << "MyValue("<<value.a<<", "<<value.b<<")";
}
}

Q_DECLARE_METATYPE(MyNamespace::MyValue)


namespace AnotherNamespace
{
typedef MyNamespace::MyValue MyValue;

class MyClass : public QObject
{
Q_OBJECT

Q_PROPERTY(MyValue value READ value WRITE setValue NOTIFY valueChanged)

public:
MyValue value()
{
return value_;
}

public slots:
void setValue(const MyValue &value)
{
if(this->value() != value)
{
value_ = value;
emit valueChanged(value);
}
}

signals:
void valueChanged(const MyValue &value);

private:
MyValue value_;
};

}

这是 test.cpp 文件:

#include "test.h"

int main(int argc, char** argv)
{
QApplication app(argc, argv);

qRegisterMetaTypeStreamOperators<MyNamespace::MyValue>("MyNamespace::MyValue");


AnotherNamespace::MyClass myObject;

myObject.setValue(MyNamespace::MyValue("the answer", 42));

QMetaObject metaObject = AnotherNamespace::MyClass::staticMetaObject;
QMetaProperty metaProperty = metaObject.property(metaObject.indexOfProperty("value"));
QVariant variant = metaProperty.read(&myObject);

MyNamespace::MyValue value = variant.value<MyNamespace::MyValue>();

qDebug() << value;


qDebug() << "\nIt's interesting, that this is working without problems:";
variant = QVariant::fromValue(MyNamespace::MyValue("2^4", 16));
value = variant.value<MyNamespace::MyValue>();

qDebug() << value;


return 0;
}

这个最小例子的输出是

QMetaProperty::read: Unable to handle unregistered datatype 'MyValue' for property 'AnotherNamespace::MyClass::value'
MyValue( "" , 0 )

It's interesting, that this is working without problems:
MyValue( "2^4" , 16 )

如前所述,从最小示例中删除任何 namespace 使用后,一切正常,输出如下

MyValue( "the answer" ,  42 ) 

It's interesting, that this is working without problems:
MyValue( "2^4" , 16 )

最佳答案

在输入问题时我找到了答案。错误在以下几行

// ...
namespace AnotherNamespace
{
typedef MyNamespace::MyValue MyValue;

class MyClass : public QObject
{
Q_OBJECT

Q_PROPERTY(MyValue value READ value WRITE setValue NOTIFY valueChanged)
// ...

当使用 Q_PROPERTY 时,我必须提供完整的类型名称以及所有命名空间。所以不要使用

Q_PROPERTY(MyValue value READ value WRITE setValue NOTIFY valueChanged)

我必须使用

Q_PROPERTY(MyNamespace::MyValue value READ value WRITE setValue NOTIFY valueChanged)

Qt Property 系统似乎无法识别 typedef。

关于c++ - 将 Qt 属性与命名空间中定义的自定义类型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889163/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com