这种将 C++ QStringList 加载为 QML ListView 模型的方式有啥问题?
Posted
技术标签:
【中文标题】这种将 C++ QStringList 加载为 QML ListView 模型的方式有啥问题?【英文标题】:What is wrong with this way of loading C++ QStringList as a model for a QML ListView?这种将 C++ QStringList 加载为 QML ListView 模型的方式有什么问题? 【发布时间】:2016-03-18 21:35:58 【问题描述】:这个程序静默失败,在调试模式或发布模式下没有消息出现,窗口不显示,但你可以在任务管理器中看到program.exe正在运行。到底是怎么回事 ?如何解决?为什么它会失败?为什么没有消息出现?
QML 接口文件
//main.qml
import QtQuick 2.5
ListView
width: 100; height: 100
model: myModel
delegate: Rectangle
height: 25
width: 100
Text text: modelData
c++主文件
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
QGuiApplication app(argc, argv);
QStringList dataList;
dataList.append("item 1");
dataList.append("item 2");
dataList.append("item 3");
dataList.append("item 4");
dataList.append("item 5");
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myModel",QVariant::fromValue(dataList) );
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
【问题讨论】:
【参考方案1】:代码不会创建窗口,无论是在 C++ 中还是在 QML 中。
用QtQuick创建窗口有两种方式:
不要使用QQmlApplicationEngine
,而是使用继承自QQuickWindow
的C++ 类QQuickView
。记得拨打show()
。这就是https://doc.qt.io/qt-5/qtquick-models-stringlistmodel-example.html 的示例所做的。
如果您使用 QQmlApplicationEngine
,则需要在 QML 文件中的某处有一个 Window。请记住将visible
设置为true。 QQmlApplicationEngine
不继承自任何窗口基类,因此需要在 QML 中创建窗口。
【讨论】:
这让我看起来像个傻瓜,谢谢你的快速回复。 为什么窗口默认不可见? 我希望能够设计使用 QML 视图的模型类。我可以制作它们并在控制台应用程序下测试它们吗?是否有专门用于测试 modelClasses 的现成控制台类? 不知道为什么windows默认是不可见的,其实我也不知道是不是这样,我就是想起来了。 wiki.qt.io/Model_Test 可以测试您的模型是否存在错误。如果您的意思是在控制台上打印模型内容,我不知道有这样的事情。 KDAB 的 Gammary 工具 (kdab.com/gammaray) 可以在 UI 中显示模型的内容以进行调试。以上是关于这种将 C++ QStringList 加载为 QML ListView 模型的方式有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何将QStringList类的对象定义为静态并初始化的问题
5.listview(QStringList QStringListModel)