2017-02-13 2 views
0

Ich bin ein Anfänger bei Qt und ich habe Schwierigkeiten, eine QStandardItemModel aus einer XML-Datei zu bevölkern.Wie bearbeite ich ein QStandardItemModel

Ich habe Folgendes versucht und das gesamte Projekt wird erfolgreich ausgeführt, aber die QtableView zeigt die Daten nicht an.

Hier ist meine main.cpp:

void readXml(const QString& fileName) { 
    QFile file(fileName); 
    if(!file.open(QFile::ReadOnly | QFile::Text)) { 
     qDebug() << "Cannot read file" << file.errorString(); 
     return; 
    } 

    StockItems* stockitems = new StockItems; 
    XmlStockItemsReader xmlReader(stockitems); 

    if(!xmlReader.read(&file)) 
     qDebug() << "Parse error in file " << xmlReader.errorString(); 
    else { 
     stockitems->print(); 
     stockitems->populateStockModel(); 
    } 
} 

int main(int argc, char* argv[]) { 
    QApplication app(argc, argv); 
    StockItems si; 

    //! Change this to match the path of your project 
    QString path = "C:\\unisa\\cos3711\\FIConcession"; 
    readXml(path + "\\stockitems.xml"); 

    si.show(); 

    return app.exec(); 
} 

In stockitems.cpp Ich habe die folgende Funktion:

void StockItems::populateStockModel() { 
    foreach(Item* item, m_items) { 
     QList<QStandardItem*> newRow; 

     QStandardItem *stockID = new QStandardItem(QString("%1").arg(item->stockID())); 
     QStandardItem *desc = new QStandardItem(QString("%2").arg(item->desc())); 
     QStandardItem *price = new QStandardItem(QString("%3").arg(item->price())); 

     newRow.append(stockID); 
     newRow.append(desc); 
     newRow.append(price); 

     stockModel->appendRow(newRow); 
    } 
} 

Wenn ich einige Debug ich, dass die stockID, desc und prices sehen richtig gelesen, Also muss das Problem irgendwo bei der Aktualisierung der stockModel liegen.

Mein Haupt StockItems Constructor ist wie folgt:

StockItems::StockItems(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::StockItems) 
{ 
    ui->setupUi(this); 
    stockModel = new QStandardItemModel(0, 3); 

    // Set Model Headers 
    stockModel->setHeaderData(0, Qt::Horizontal, "Stock ID", Qt::DisplayRole); 
    stockModel->setHeaderData(1, Qt::Horizontal, "Description", Qt::DisplayRole); 
    stockModel->setHeaderData(2, Qt::Horizontal, "Price", Qt::DisplayRole); 

    // Link Model to Table View 
    ui->tvStock->setModel(stockModel); 
} 

ich ein Add-Taste haben, die den folgenden onclick Code enthält, die wie erwartet funktioniert so bin ich mir nicht sicher, ob ich das richtig stockModel Referenzierung bin.

QList<QStandardItem*> newRow; 

QStandardItem* stockID = new QStandardItem(QString("%1").arg(ui->tbStockId->text())); 
QStandardItem* desc = new QStandardItem(QString("%2").arg(ui->tbDesc->text())); 
QStandardItem* price = new QStandardItem(QString("%3").arg(ui->sbPrice->text())); 

newRow.append(stockID); 
newRow.append(desc); 
newRow.append(price); 

stockModel->appendRow(newRow); 

Schließlich denke ich, das helfen könnte, meine stockitems.h Datei:

class StockItems : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit StockItems(QWidget *parent = 0); 
    ~StockItems(); 
    void populateStockModel(); 
    void addItem(Item* item); 
    void print() const; 

private slots: 
    void on_btnAdd_clicked(); 
    void on_btnDelete_clicked(); 

private: 
    Ui::StockItems *ui; 
    QStandardItemModel *stockModel; 
    QList<Item*> m_items; 
}; 

Das ist eine Menge und lassen Sie es mich wissen, wenn ich etwas anderes bieten sollte, aber ich bin wirklich verloren, wie zu Füllen Sie dieses Modell ordnungsgemäß aus.

Danke für jede Anleitung!

+0

Soweit ich sehen, dies richtig aussieht. Ich würde vorschlagen, eine Debugfunktion zu schreiben, um den Inhalt des Modells auszugeben, nachdem Sie es ausgefüllt haben. Stellen Sie sicher, dass die Spalten- und Zeilenanzahl wie erwartet und der Text jedes Elements übereinstimmt. Das Problem könnte in Ihrer Tabellenansichtseinstellung sein, obwohl das auch OK aussieht. – goug

+0

Ich denke, das Problem kann im StockItems-Konstruktor sein, wo ich 'stockModel = new QStandardItemModel (0, 3) sage;' aber wenn ich das ändere, bricht es ... Nicht sicher, was zu tun ist:/ –

+0

Ich sehe die Antwort war hinzugefügt. Diese Antwort ist richtig und das habe ich übersehen, als ich den Code gelesen habe. – goug

Antwort

1

Ihre readXml Funktion bevölkert nicht die StockItems Instanz, die Sie in Ihrer main Funktion erstellen, sondern eine völlig neue StockItems Instanz, die nicht überall verwendet wird.

Zum Beispiel statt

StockItems* stockitems = new StockItems; 

in Ihrer readXml Funktion, lassen readXml nehmen Sie ein anderes StockItems Argument, und verwenden Sie das:

void readXml(const QString& fileName, StockItems *stockItems) { 
    // do everything here as before, except for the 
    // StockItems* stockitems = new StockItems; 
    ... 
} 

int main(int argc, char* argv[]) { 
    ... 
    readXml(path + "\\stockitems.xml", &si); 
    si.show(); 
    ... 
} 
+0

Du bist ein verdammter Lebensretter, danke! –

Verwandte Themen