在我当前的基于 Qt-Quick-UI 的 C++ 应用程序中,我想制作一个 QObject
用Q_PROPERTY(QAbstractListModel * ...)
可用于我的用户界面:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(MyListModel* model READ model CONSTANT)
public:
const MyListModel* model() const {return m_model.get();}
private:
std::unique_ptr<MyListModel> m_model;
}
基于documentation我理解这应该起作用的方式是,例如我的 main.cpp 我执行以下操作:
int main(int argc, char *argv[])
{
std::unique_ptr<QCoreApplication> app; // allows both console and GUI mode
BackendController controller; // holds a MyClass object and according (pointer-typed) getter
std::unique_ptr<QQmlApplicationEngine> qmlengine; // needed for GUI mode
if(GUI_MODE)
{
app.reset(new QApplication(argc, argv));
qmlengine.reset(new QQmlApplicationEngine(app));
qmlengine->rootContext()->setContextProperty("myobject", controller.getMyObject());
engine.load(QUrl(QStringLiteral("qrc:/uimain.qml")));
auto rcontext = qmlengine->rootContext();
} // else ...
return app->exec();
}
我希望能够在我的 QML 中做这样的事情:
ListView {
id: listview
model: myobject.model
delegate: Text {
text: "An entry"
}
}
但是,即使我确保 MyListModel
中有条目, 我的 ListView
留空。这就是我输入 auto rcontext
的原因行,在那里设置一个断点并运行调试器(在尝试了无数其他方法来检查为什么没有显示之后)。
当比较 MyObject
的指针时存储在 BackendController
类(以及由 getter 返回的指针)指向在 rcontext
中设置的上下文属性, 存在不匹配。调试器声明我设置的“myobject”属性是 QVariant<bool>
(评估为 true
),并且在提取实际存储值时(即应该是 QObject*
),它不同于我传递给 setContextProperty
的指针功能。
即使从 main()
传递指针时,我也注意到相同的行为范围,例如 app.get()
, 但是当通过 QVariant
“原语”(如 QString
s)他们可以毫无问题地注册。
如果这是相关的:在初始化 QQmlApplicationEngine
之后在加载实际的 QML 文件之前,我还为 QML 可能接触到的所有对象类型(即 MyObject
和 MyListModel
)注册了(不可创建的)QML 类型,并在 QML 中导入了相应的伪模块 - 到没有用。
所以我现在想知道这里发生了什么。这是 Qt 5.10 如何评估 setContextProperty
的一些缺陷吗?给定时的功能 QObject*
类型参数?还是我在这里的设置中严重忽略了某些内容?
最佳答案
事实证明,我的错误是将 MyClass
getter 函数 (controller.getMyObject()
) 设为 const
函数。显然,setContextProperty()
函数需要一些 QVariant
或 绝不 const
QObject*
。
关于c++ - 将 QObject* 设置为 QMLEngine 根上下文属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055536/