2017-02-13 42 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

你是一個瘋狂的救星,謝謝! –