QML - 如何使用 QStringList 作为 ListView 的模型?

doc*_*joe 3 qt listview qml qtquick2

我尝试制作 TelnetClient。我使用 FileIO 来读取 Telnet。读取或写入没有问题,还创建了一个字符串列表,但我需要向 ListView 显示 QStringList,但出现错误:“m_model 未定义”。

我创建 QStringList:

QStringList FileIO::read() {
if (m_source.isEmpty()) {
    emit error("source is empty");
    return QStringList();
}

QFile file(m_source);
QString fileContent;
QString line;
QStringList list;

if ( file.open(QIODevice::ReadWrite) ) {
    QTextStream t( &file );
    line = t.readAll();

    fileContent += line;
    list.append(line.split("\r\n"));

    foreach (QString item, list) {
        if (item[0].isNumber()) {
            list2.append(item);
        }
    }

    QQmlContext *ctxt;
    ctxt->setContextProperty("m_model", QVariant::fromValue(list2));

    qDebug() << "\r\n\r\nlist2 =" << list2;

    line = t.readAll();

    qDebug() << "SOURCE" << m_source;
    file.close();
}
else {
    emit error("Unable to open the file");
    return QStringList();
}

return list2;
Run Code Online (Sandbox Code Playgroud)

这可以成功创建一个新的QStringList,并且我将我的字符串列表指定为模型;m_model。

ListView {
    id: listView1
    x: 0
    y: 0
    model: m_model
    delegate: Rectangle{
        Text {text: modelData }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的列表视图。当我这样尝试时,我收到错误。我怎么解决这个问题。如果我可以在 main.cpp 中使用“list2”,我可以解决问题,但我不知道如何在 main.cpp 中使用它,因为它存在于另一个类中。

谢谢你!

Fra*_*dez 5

您可以尝试使用该类的实例设置上下文属性。这样,您可以在 main 中实例化该类,然后传递它的地址来设置上下文属性。如果模型的数据在程序运行时可能会发生变化,我建议将 QStringList 实现为Q_Property

//main.cpp

FileIO fileIO;
QQmlApplicationEngine engine;
QQmlContext* ctx = engine.rootContext();
ctx->setContextProperty("fileio", &fileIO);
engine.load(/* Path to your qml */);    


//qml
ListView {
    id: listView1
    x: 0
    y: 0
    model: fileio.m_model
    delegate: Rectangle{
        Text {text: modelData }
    }
}
Run Code Online (Sandbox Code Playgroud)