Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt自定义委托崩溃,无错误代码_C++_Qt_Delegates - Fatal编程技术网

C++ 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)

我尝试按照《Qt开发的基础》一书中的一个例子创建一个自定义委托

目标是创建一个包含两列的表。 第一个是行号。 第二列是一些任意数字,但以条形样式显示。 我运行程序后,程序是如何崩溃的

这是我的密码:

主窗口类

#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