qvariant_cast导致段错误

时间:2014-05-06 21:31:01

标签: qt5 qvariant

在qt的项目/视图框架中,我试图将QColorDialog保存为用户数据,然后在编辑期间以及在绘图期间在tableview中检索该对话框。

在我的类构造函数中我做

QStandardItem *item = new QStandardItem();
QColorDialog *colorDlg = new QColorDialog(QColor(0,0,255), this);
item->setData(QVariant::fromValue(colorDlg), ColorDialogRole);
mTableModel->setItem(0,2,item);

然后,在我的代表的油漆功能中,我有

void ReportFigureTableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QVariant vColorDlg= index.data(ReportFigure::ColorDialogRole);
    if(vColorDlg.isValid())
    {
        ////////////////////////////////////////////////
        // Program segfaults on the next line ... why?
        ////////////////////////////////////////////////
        QColorDialog *colorDlg = qvariant_cast<QColorDialog*>(vColorDlg);
        if(colorDlg != NULL)
        {
            painter->save();
            QStyleOptionViewItem opt = option;
            initStyleOption(&opt, index);

            painter->fillRect(opt.rect, colorDlg->selectedColor());
            painter->restore();
        }
        else
            QStyledItemDelegate::paint(painter, option, index);
    }
    else
        QStyledItemDelegate::paint(painter, option, index);
}

在运行时,表格第一次出现(虽然颜色错误......我假设不同的问题)。我双击编辑单元格,它会按预期显示对话框。但是,当我关闭时,它会在指定的行上发生段错误。我不明白为什么,因为我认为我正在做所有必要的检查。

1 个答案:

答案 0 :(得分:0)

您在QStandardItem对象上设置数据。同时,您正在检索QModelIndex对象上的数据。现在为什么变体有效是一个谜。也许是因为ReportFigure::ColorDialogRole等于内置Qt角色while it should be at least Qt::UserRole

无论如何在paint()方法中,您可以使用

访问之前设置的项目
QStandardItem *item = mTableModel->itemFromIndex(index);