首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableView/QAbstractTableModel绑定

QTableView/QAbstractTableModel绑定
EN

Stack Overflow用户
提问于 2017-01-12 17:32:58
回答 1查看 412关注 0票数 0

在$QTDIR\Examples\Qt-5.7\widgets\tutorials\modelview\2_formatting.中有一个例子main.cpp如下所示:

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

代码语言:javascript
复制
//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)。

然后我改变了我的设计。只需在主窗口UI中显示我的内容。但是,如果我用mainwindow.cpp编写,我就不能成功地将模型绑定到视图,就像这样:

代码语言:javascript
复制
NSalarmModel alarmModel(0);                (1)
alarmForm->setModel( &alarmModel);

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

代码语言:javascript
复制
NSalarmModel *alarmModel = new NSalarmModel(0);           (2)
alarmForm->setModel( alarmModel);

所以我的问题是为什么句子(1)不能很好地工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 17:39:20

在(1)中,模型被分配到堆栈中,并在代码块的末尾被销毁。您必须将其分配到堆中,如(2)所示。

请参阅The stack and the heap

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41609504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档