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

时间:2016-08-05 14:56:56

标签: qt listview qml qtquick2

我尝试使用TelnetClient.I使用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;

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

ListView {
    id: listView1
    x: 0
    y: 0
    model: m_model
    delegate: Rectangle{
        Text {text: modelData }
    }
}

这是我的ListView。当我这样尝试时,我得到了错误。我怎么解决这个问题。如果我可以使用&#34; list2&#34;在main.cpp中我可以解决问题,但我不知道如何在main.cpp中使用它,因为它存在于另一个类中。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以尝试使用类的实例设置context属性。这样,您可以在main中实例化该类,然后传递它的地址以设置context属性。如果在程序运行时模型的数据可能会发生变化,我建议将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 }
    }
}

答案 1 :(得分:0)

要详细说明Francisco's answer:如果程序运行时模型的数据可能发生变化,那么将QStringList实现为Q_PROPERTY的确是最干净的解决方案,因为当模型数据更改时,它将向QML对象发送信号。一个很好的例子是here

According to the Qt Manual还有另一种选择:

注意:该视图无法知道QStringList的内容已更改。如果QStringList发生更改,则必须通过再次调用QQmlContext::setContextProperty()来重置模型。

此技术的(未经测试的)示例如下所示:

main.cpp

QStringList updateStringList() {
  // Your code from "I create QStringList" goes here.
}

QStringList myStringList = updateStringList();

QQmlApplicationEngine engine;
QQmlContext* ctx = engine.rootContext();
ctx->setContextProperty("m_model", &myStringList);
engine.load("ListView.qml");

// ... more code ...

myStringList = updateStringList();
ctx->setContextProperty("m_model", &myStringList);

ListView.qml

ListView {
    id: listView1
    x: 0
    y: 0
    model: fileio.m_model
    delegate: Rectangle{
        Text {text: modelData }
    }
}