2014-05-06 87 views
0

在qt的項目/視圖框架中,我試圖保存一個QColorDialog作爲用戶數據,然後檢索該對話框作爲編輯器,以及在繪製期間在tableview中。qvariant_cast導致段錯誤

在我的類的構造函數我做

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

然後,我委託的paint函數中我有

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

在運行時,該表顯示了在第一時間(雖然與錯誤的顏色。 ..我假設的不同問題)。我雙擊編輯單元格,並按預期調出對話框。但是,當我關閉時,它會在指定的行上發生段錯誤。我不明白爲什麼,因爲我認爲我正在做所有必要的檢查。

回答

0

您將數據設置爲QStandardItem對象。同時,您正在檢索QModelIndex對象上的數據。現在爲什麼變種有效是一個謎。也許是因爲ReportFigure::ColorDialogRole等於內置Qt角色while it should be at least Qt::UserRole

無論如何在paint()方法可以訪問使用

QStandardItem *item = mTableModel->itemFromIndex(index); 
+0

先前設置的項目根據該文件,QModelIndex ::數據()訪問所引用的項目的數據;即它相當於itemFromIndex(index) - > data()。 ReportFigure :: ColorDialogRole已經設置爲Qt :: UserRole,所以不應該是問題。 – ryan0270