在当前基于Qt-Quick的C++应用程序中,我希望使QObject具有一个对UI可用的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;
}基于文档,我理解它应该工作的方式是,例如,在我的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)时,它们没有问题地注册。
如果这与此相关:在初始化QQmlApplicationEngine之后,在加载实际的QML文件之前,我还为QML可能接触的所有对象类型(即MyObject和MyListModel)注册了(不可创建的) QML类型,并在QML中导入了相应的伪模块,但没有结果。
所以我现在想知道这是怎么回事。这是QT5.10在给定setContextProperty参数时如何计算QObject*函数的缺陷吗?还是我完全忽略了我在这里的设置?
发布于 2018-03-02 11:25:08
事实证明,我的错误是把MyClass getter函数(controller.getMyObject())变成了const函数。显然,const函数需要一些QVariant或,而不是 QObject*。
https://stackoverflow.com/questions/49055536
复制相似问题