gpt4 book ai didi

c++ - Qt 自定义委托(delegate)崩溃,没有错误代码

转载 作者:行者123 更新时间:2023-11-30 01:46:27 25 4
gpt4 key购买 nike

我尝试按照“Qt 开发基础”一书中的示例创建自定义委托(delegate)。

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

这是我的代码:

主窗口类

#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))));
}
}

自定义委托(delegate)类

#include "bardelegate.h"

BarDelegate::BarDelegate(QObject *parent)
{

}


QSize BarDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return QSize(30, 15);
}

void BarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());

int value = index.model()->data(index, Qt::DisplayRole).toInt();
double factor = (double) value/100.0;

painter->save();

if(factor > 1)
{
painter->setBrush(Qt::red);
factor = 1;
}
else
painter->setBrush(QColor(0, (int)(factor*255), 255-(int)(factor*255)));

painter->setPen(Qt::black);
painter->drawRect(option.rect.x()+2, option.rect.y()+2, (int)(factor*(option.rect.width()-5)), (int)(factor*(option.rect.height()-5)));
painter->restore();
}

问题是什么?

最佳答案

问题可能出在这两行:

BarDelegate delegate;
Table->setItemDelegateForColumn(1, &delegate);

您在堆栈中分配delegate 并将其地址传递给setItemDelegateForColumn 函数。但是,一旦执行离开 MainWindow 构造函数的范围,delegate 就会被删除。因此,您的 TableView 获得了一个无效的委托(delegate)。要解决此问题,您需要使用指向您的委托(delegate)的指针。 IE。将 BarDelegate delegate; 声明为 MainWindow 类成员并且:

delegate = new BarDelegate(this);
Table->setItemDelegateForColumn(1, delegate);

关于c++ - Qt 自定义委托(delegate)崩溃,没有错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com