2017-01-12 9 views
0

$ QTDIR \ Examples \ Qt-5.7 \ widgets \ tutorials \ modelview \ 2_formattingに1つの例があります。 main.cppは次のようになります。QTableView/QAbstractTableModelバインディング

#include <QtWidgets/QApplication> 
#include <QtWidgets/QTableView> 
#include "mymodel.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTableView tableView; 
    MyModel myModel(0); 
    tableView.setModel(&myModel); 
    tableView.show(); 
    return a.exec(); 
} 

私は例に従ってテストプログラムを書いています。目的はtabwidgetを追加することです。私自身のモデルでタブ内にタブビューを表示します。私のコードは次のようである:

//nsalarmmodel.h 
#ifndef NSALARMMODEL_H 
#define NSALARMMODEL_H 

#include <QAbstractTableModel> 

class NSalarmModel : public QAbstractTableModel 
{ 
    Q_OBJECT 
public: 
    NSalarmModel(QObject *parent); 
    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE ; 
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; 
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; 
    QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; 

}; 

//main.cpp 
#include "nsalarmmodel.h" 
#include <QTabWidget> 
#include <QtWidgets/QGridLayout> 


int main(int argc, char *argv[]) 
{ 
QApplication a(argc, argv); 

QTabWidget *tabWidget; 
QGridLayout *gridLayout; 

tabWidget = new QTabWidget; 
QTabWidget *alarmTab = new QTabWidget; 
QTableView *alarmForm = new QTableView(alarmTab); 
tabWidget->addTab(alarmTab,"TEST"); 
gridLayout = new QGridLayout(alarmTab); 
gridLayout->setSpacing(6); 
gridLayout->setContentsMargins(11, 11, 11, 11); 
gridLayout->setObjectName(QStringLiteral("gridLayout")); 
gridLayout->addWidget(alarmForm, 0, 0, 1, 1); 
tabWidget->show(); 

//QTableView tableView; 
NSalarmModel alarmModel(0); 
alarmForm->setModel(&alarmModel); 

return a.exec(); 
} 

、alarmForm(QTableview)にalamModel(QAbstractTableModel)を結合するのに成功することができます。

次にデザインを変更しました。メインウィンドウのUIに自分のコンテンツを表示するだけです。

NSalarmModel alarmModel(0);    (1) 
alarmForm->setModel(&alarmModel); 

私は正常にバインドするために、このようにしなければならない:

NSalarmModel *alarmModel = new NSalarmModel(0);   (2) 
alarmForm->setModel(alarmModel); 

だから私の質問はあるが、私はmainwindow.cppに書き込みに成功した場合だけ好きビューに私のモデルをバインドすることはできませんなぜ文章(1)がうまくいきませんか?

答えて

0

In(1)モデルはスタックに割り当てられ、コードブロックの最後で破棄されます。 (2)のようにヒープに割り当てる必要があります。

The stack and the heap