gpt4 book ai didi

c++ - 如何将抽象类指针作为 Q_PROPERTY?

转载 作者:行者123 更新时间:2023-11-30 03:21:52 26 4
gpt4 key购买 nike

我正在尝试将抽象类的实例用作我的一个扩展 QQuickItems 中的属性。我有一个基础类(class),像这样:

class VizFactory : public QQuickItem
{
Q_OBJECT;
Q_PROPERTY(VisualizationOptions * options READ options WRITE setOptions);

private:
VisualizationOptions * m_visualizationOptions;

public:
VizFactory(QQuickItem * parent = 0) : QQuickItem(parent) {}
~VizFactory() {}

VisualizationOptions * options() const;
void setOptions(VisualizationOptions * options);
};

其中 VisualizationOptions 是一个抽象类,它扩展了一些其他类,例如 LayoutOptionsFooOptions:

class VisualizationOptions : public QObject
{
Q_OBJECT

public:
VisualizationOptions(QObject * parent = 0) : QObject(parent) {}
virtual std::string getVisualizationName() const = 0;
};

我使用以下方法在我的主文件中注册所有内容:

qmlRegisterUncreatableType<VisualizationOptions>("Wormhole", 1, 0, "VisualizationOptions",
QString("Cannot create abstract class VisualizationOptions"));
qmlRegisterType<LayoutOptions>("Wormhole", 1, 0, "LayoutOptions");
qmlRegisterType<FooOptions>("Wormhole", 1, 0, "FooOptions");

然后,我尝试通过放入以下内容在 qml 文件中使用它:

VizFactory {
options: LayoutOptions {
type: "row"

FooOptions {}
LayoutOptions {
type: "col"
FooOptions {}
FooOptions {}
}
}
}

但是,我收到的错误来自 qml 文件中定义 options 的行,它说:“无法分配给不存在的默认属性”。为什么会这样?我没有正确注册类型吗?我是否错误地实例化了 QML 中的对象?

最佳答案

问题不是由抽象类引起的,而是因为 QObject 没有 childItems ,与具有该属性的 QQuickItem 不同。

如果你使用 QtObject,你会看到同样的东西:

QtObject{
QtObject{

}
}

留言:

Cannot assign to non-existent default property

所以有3种可能的解决方案:

  • 使 VisualizationOptions 继承自 QQuickItem,这样您就可以拥有 child 。

  • 不要分配 child ,例如你的代码应该工作如下:

    VizFactory{
    options: LayoutOptions{
    }
    }
  • 使用 QQmlListproperty

我将展示使用第三种方法的示例:

class VisualizationOptions: public QObject{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<VisualizationOptions> childOptions READ options)
public:
using QObject::QObject;
virtual std::string getVisualizationName() const = 0;
QQmlListProperty<VisualizationOptions> options(){
return QQmlListProperty<VisualizationOptions>(this, this,
&VisualizationOptions::appendOption,
&VisualizationOptions::optionCount,
&VisualizationOptions::option,
&VisualizationOptions::clearOptions);
}
void appendOption(VisualizationOptions* p) {
m_childsoptions.append(p);
}
int optionCount() const{
return m_childsoptions.count();
}
VisualizationOptions *option(int index) const{
return m_childsoptions.at(index);
}
void clearOptions() {
m_childsoptions.clear();
}
private:
static void appendOption(QQmlListProperty<VisualizationOptions>* list, VisualizationOptions* p) {
reinterpret_cast<VisualizationOptions* >(list->data)->appendOption(p);
}
static void clearOptions(QQmlListProperty<VisualizationOptions>* list) {
reinterpret_cast<VisualizationOptions* >(list->data)->clearOptions();
}
static VisualizationOptions* option(QQmlListProperty<VisualizationOptions>* list, int i) {
return reinterpret_cast< VisualizationOptions* >(list->data)->option(i);
}
static int optionCount(QQmlListProperty<VisualizationOptions>* list) {
return reinterpret_cast< VisualizationOptions* >(list->data)->optionCount();
}
QVector<VisualizationOptions *> m_childsoptions;
};

*.qml

VizFactory{
options:
LayoutOptions{
type: "row"
childOptions: [
FooOptions{},
LayoutOptions{
type: "col"
childOptions: [
FooOptions {},
FooOptions {}
]
}
]
}
}

您可以在下面的link中找到完整的代码.

关于c++ - 如何将抽象类指针作为 Q_PROPERTY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757280/

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