如何填充 QStandardItemModel

How to Populate a QStandardItemModel

本文关键字:QStandardItemModel 填充 何填充      更新时间:2023-10-16

我是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();
    ...
}
相关文章:
  • 没有找到相关文章