QTableView / QAbstractTableModel绑定

时间:2017-01-12 09:32:58

标签: qt

$ QTDIR \ Examples \ Qt-5.7 \ widgets \ tutorials \ modelview \ 2_formatting中有一个示例。 main.cpp是这样的:

#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。并使用我自己的模型在选项卡中显示tabview。我的代码是这样的:

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

并且可以成功将alamModel(QAbstractTableModel)绑定到alarmForm(QTableview)。

然后我改变了我的设计。只需在mainwindow UI中显示我的内容。但如果我在mainwindow.cpp中写一下,我就无法成功地将我的模型绑定到视图中:

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

我必须这样做才能成功绑定:

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

所以我的问题是为什么句子(1)效果不好?

1 个答案:

答案 0 :(得分:0)

在(1)中,模型在堆栈中分配,并在代码块的末尾被销毁。你必须像在(2)中一样在堆中分配它。

请参阅The stack and the heap