2017-02-13 74 views
0

我是Qt的初学者,我正努力从XML文件填充QStandardItemModel如何填充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; 
}; 

这是很多,请让我知道我是否应该提供任何东西,但我真的失去了对如何正确填充此模型。

感谢您的任何指导!

+0

据我看到的,这看起来是正确的。我建议编写一个调试函数,在你填充模型后转储模型的内容。确保列和行计数符合预期,并确保每个项目的文本。问题可能出现在您的表格视图设置中,虽然这也看起来不错。 – goug

+0

我认为这个问题可能出现在StockItems构造函数中,我说'stockModel = new QStandardItemModel(0,3);'但是每当我改变它它就会中断...不知道该怎么办:/ –

+0

我看到答案是添加。这个答案是正确的,当我读代码的时候我错过了。 – goug

回答

1

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(); 
    ... 
} 
+0

你是一个疯狂的救星,谢谢! –