我是Qt的初学者,我很难从XML文件中填充QStandardItemModel。
我尝试了以下操作,整个项目都成功运行,但是QtableView没有显示数据。
这是我的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();
}在stockitems.cpp中,我具有以下功能:
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);
}
}如果我做了一些调试,我可以看到stockID、desc和prices被正确读取,所以问题肯定在更新stockModel的某个地方。
我的主要StockItems构造器如下:
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);
}我有一个add按钮,它包含下面的onclick代码,按预期工作,所以我只是不确定我是否正确地引用了stockModel。
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);最后,我认为这可能会有帮助,我的stockitems.h文件:
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;
};这是很多,请让我知道,如果我应该提供任何其他,但我真的不知道如何填充这一模式正确。
谢谢您的指导!
发布于 2017-02-13 20:24:54
您的readXml函数不填充在main函数中创建的StockItems实例,而是一个全新的StockItems实例,在任何地方都不使用。
例如,而不是
StockItems* stockitems = new StockItems;在您的readXml函数中,让readXml使用另一个StockItems参数,并使用它:
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();
...
}https://stackoverflow.com/questions/42211251
复制相似问题