gpt4 book ai didi

c++ - 如何填充 QStandardItemModel

转载 作者:行者123 更新时间:2023-11-28 05:17:57 24 4
gpt4 key购买 nike

我是 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);
}
}

如果我进行一些调试,我可以看到 stockIDdescprices 被正确读取,所以问题一定出在某个地方更新 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);
}

我有一个添加按钮,其中包含以下 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;
};

这太多了,请告诉我是否应该提供其他任何东西,但我真的不知道如何正确填充这个模型。

感谢您的指导!

最佳答案

您的 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();
...
}

关于c++ - 如何填充 QStandardItemModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42211251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com