C++ Qt自定义委托崩溃,无错误代码
我尝试按照《Qt开发的基础》一书中的一个例子创建一个自定义委托 目标是创建一个包含两列的表。 第一个是行号。 第二列是一些任意数字,但以条形样式显示。 我运行程序后,程序是如何崩溃的 这是我的密码: 主窗口类C++ Qt自定义委托崩溃,无错误代码,c++,qt,delegates,C++,Qt,Delegates,我尝试按照《Qt开发的基础》一书中的一个例子创建一个自定义委托 目标是创建一个包含两列的表。 第一个是行号。 第二列是一些任意数字,但以条形样式显示。 我运行程序后,程序是如何崩溃的 这是我的密码: 主窗口类 #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Table = new QTableView(this);
Model = new QStandardItemModel(this);
dataInit(Model);
Table->setModel(Model);
setCentralWidget(Table);
// If I comment out these two lines
// the program works well
// A table view with number shows
BarDelegate delegate;
Table->setItemDelegateForColumn(1, &delegate);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dataInit(QStandardItemModel* Model)
{
// Fill the Model with data
for(int r = 1; r < 11; ++r)
{
QStandardItem* item = new QStandardItem(QString("0%1").arg(r));
item->setEditable(false);
Model->setItem(r - 1, 0, item);
Model->setItem(r - 1, 1, new QStandardItem(QString(QString::number(r*17%100))));
}
}
问题出在哪里?问题可能出在以下两行:
BarDelegate delegate;
Table->setItemDelegateForColumn(1, &delegate);
在堆栈中分配委托
,并将其地址传递给setItemDelegateForColumn
函数。但是,委托
在执行离开主窗口
构造函数的范围后立即被删除。因此,表视图将获得一个无效的委托。要解决此问题,需要使用指向委托的指针。即声明BarDelegate委托代码>作为主窗口
类成员和:
delegate = new BarDelegate(this);
Table->setItemDelegateForColumn(1, delegate);
问题可能出在以下两行:
BarDelegate delegate;
Table->setItemDelegateForColumn(1, &delegate);
在堆栈中分配委托
,并将其地址传递给setItemDelegateForColumn
函数。但是,委托
在执行离开主窗口
构造函数的范围后立即被删除。因此,表视图将获得一个无效的委托。要解决此问题,需要使用指向委托的指针。即声明BarDelegate委托代码>作为主窗口
类成员和:
delegate = new BarDelegate(this);
Table->setItemDelegateForColumn(1, delegate);
甚至Table->setItemDelegateForColumn(1,newbardelegate(this))代码>@vahancho是的。这就是问题所在。谢谢奇怪的是,这本书在堆栈中创建了委托。@tom book编写者也是程序员,也就是说,很容易编写错误代码。@UmNyobe Lol.abcdefghijkOr甚至Table->setItemDelegateForColumn(1,new BarDelegate(this))代码>@vahancho是的。这就是问题所在。谢谢奇怪的是,这本书在堆栈中创建了委托。@tom书的作者也是程序员,也就是说,他们很容易编写错误代码。@UmNyobe Lol.abcdefghijk