这种将 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)

QStringList 获取第一 个元素

求教QStringList 拆分为 多个 QStringList

(C++)除基取余法:将十进制数转化为Q进制数

qt 下怎么把Qstringlist 转化为Qbytearray 类型?