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!
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
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:/ –
Ich sehe die Antwort war hinzugefügt. Diese Antwort ist richtig und das habe ich übersehen, als ich den Code gelesen habe. – goug