2017-02-13 16 views
0

私はQtの初心者です。私はQStandardItemModelをXMLファイルから生成するのに苦労しています。QStandardItemModelを移植する方法

私は以下を試してみましたが、プロジェクト全体が正常に実行されましたが、QtableViewにはデータが表示されません。

はここに私のmain.cppです:stockitems.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(); 
} 

I持って次の関数:

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

私は私が正しくstockModelを参照していた場合ので、私はちょうどよく分からない期待どおりに動作次onclickのコードが含まれて追加ボタンを持っています。

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

私は 'stockModel = new QStandardItemModel(0、3);'と言うStockItemsコンストラクタに問題があると思うが、これを変更するたびに...何をすべきかわからない:/ –

+0

私は答えを見ている追加されました。その答えは正しい、私はコードを読んでいたときにそれを逃した。 – goug

答えて

1

main関数で作成したのインスタンスには、インスタンスが作成されますが、まったく新しいStockItemsインスタンスは使用されません。例えば

、代わりにあなたのreadXml機能で

StockItems* stockitems = new StockItems; 

の、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

あなたは人生の節約になりました、ありがとう! –

関連する問題