gpt4 book ai didi

c++ - 无法从 QML 访问 C++ QObject 子类方法

转载 作者:行者123 更新时间:2023-11-28 06:43:15 25 4
gpt4 key购买 nike

昨天我被要求使用 QML 重新创建一个常规的 QT 表单(这是我第一次尝试使用 QLM)。在我尝试在 QML 中使用 C++ 方法之前,一切都很顺利。这显然不是原始代码,但场景看起来像这样:

我有一个从 QObject 派生的父类(super class),它有一些属性、方法甚至虚方法:

class SuperClass : public QObject {
Q_OBJECT
Q_PROPERTY(QString someProperty READ someProperty WRITE setSomeProperty)

protected:
QString m_someProperty;

public:
QString someProperty(void){return m_someProperty;} //get method
void setSomeProperty(QString newValue){m_someProperty = newValue;} //set method
Q_INVOKABLE virtual QString printSomething(void) = 0;
}

然后我有一个从 SuperClass 派生的类(就像一个特化),具有一些更具体的属性和方法,当然还有虚拟方法实现和东西:

class DerivedClass : public SuperClass {
Q_PROPERTY(QString someSpecificProperty READ someSpecificProperty WRITE setSomeSpecificProperty)

private:
QString m_someSpecificProperty;

public:
QString specificProperty(void){return m_someSpecificProperty;} //get method
void someSpecificProperty(QString newValue){m_someSpecificProperty = newValue;} //set method
QString printSomething(void){return QString("Something!");} //SuperClass virtual method
Q_INVOKABLE QString printSomethingSpecific(void){return QString("Something Specific!");}
}

好的,就是这样!现在假设 DerivedClass 被实例化并以“DrvClass”的名称正确添加到 QML 上下文中,例如,我有一些 QML 控件,例如具有“文本:”属性的 TextField:

text: DrvClass.someProperty

使用 MasterClass 的属性,它工作得很好。

text: DrvClass.printSomething()

即使使用在派生类中实现的 MasterClass 中的虚拟方法也能正常工作。但是……

text: DrvClass.someSpecificProperty

不起作用,我得到类似“无法将 [undefined] 分配给 QString”的信息

text: DrvClass.printSomethingSpecific()

也不行! “TypeError: Property 'printSomethingSpecific' of object SuperClass() is not a function”奇怪的是,它说它不是 SuperClass 的函数,是派生类的实例化类!

我一直在寻找类似的错误,但大部分时间都是来自那些忘记包含 Q_OBJECT 宏的人......我的肯定在那里!似乎 QML 不喜欢从 QObjects 派生的其他类派生的很多类:-/可能与元对象编译器有关,元对象编译器只在找到 Q_OBJECT 宏而不是其子类的地方寻找可调用方法!

那么你们认为解决这个问题的方法是什么?我可以将 Q_OBJECT 宏添加到 DerivedClasses 而不是 SuperClass,但我真的需要 SuperClass 成为 QObject 因为信号和东西!那么是否有一些其他的宏我必须添加到 DerivedClass 才能让 moc“看到”它?或者这只是经验不足的结果,我在某个地方犯了一个愚蠢的错误?

最佳答案

DerivedClass 缺少 Q_OBJECT 宏(它不是继承的!)。

然后只需在您的项目上再次运行 qmake 并编译:它应该可以工作。

关于c++ - 无法从 QML 访问 C++ QObject 子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524812/

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