我尝试使用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中使用它,因为它存在于另一个类中。
谢谢!
答案 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 }
}
}