2016-08-05 28 views
2

Ich versuche, TelnetClient.I verwenden FileIO für Telnet lesen. Es gibt kein Problem lesen oder schreiben und erstellen Sie auch eine String-Liste, aber ich muss QStringList zu ListView aber ich bekomme Fehler: "m_model ist nicht definiert".QML - Wie verwende ich QStringList als ein Modell von ListView?

Ich schaffe 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; 

Dies kann eine neue QStringList erfolgreich machen und auch ordne ich meine String-Liste als Modell; m_model.

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

und hier ist meine ListView. Wenn ich so versuche, bekomme ich Fehler. Wie kann ich dieses Problem lösen? Wenn ich "list2" in main.cpp verwenden kann, kann ich das Problem lösen, aber ich weiß nicht, wie ich es in main.cpp verwenden kann, weil es in einer anderen Klasse existiert.

Vielen Dank!

+0

'QQmlContext * ctxt; ctxt-> setContextProperty ("m_model", QVariant :: fromValue (list2)); 'Sie erstellen sogar kein ctxt-Objekt. Das Programm sollte bei diesem Schritt abstürzen. Trotz der Tatsache, dass Sie keine qml-Engine haben, gibt es überhaupt keinen Kontext. [This] (http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html) Link kann Ihnen auch helfen. – folibis

Antwort

2

Sie können versuchen, die context -Eigenschaft mit einer Instanz der Klasse festzulegen. Auf diese Weise können Sie die Klasse in main instanziieren und dann ihre Adresse übergeben, um die context -Eigenschaft festzulegen. Wenn sich die Daten des Modells ändern, während das Programm läuft, würde ich vorschlagen, die QStringList als Q_Property zu implementieren.

//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 } 
    } 
}