2013-03-05 91 views
1

我有QTableView派生視圖的QStyledItemDelegate派生對象。我根據模型索引數據類型進一步委託繪畫和編輯器創建。對於bool s,我想通過複選框來表示狀態 - 但複選框從不出現。無法在QStyledItemDelegate中繪製複選框

這是基礎的委託漆功能:

void Sy_QtPropertyDelegate::paint(QPainter* painter, 
            const QStyleOptionViewItem& option, 
            const QModelIndex& index) const 
{ 
    painter->save(); 

    if (index.column() == 0) { 
     ... 
    } else { 
     QVariant var = index.data(); 
     bool modified = index.data(Sy_QtPropertyModel::ModifiedRole).toBool(); 

     // If the data type is one of our delegates, then push the work onto 
     // that. 
     auto it = delegateMap_.find(var.type()); 
     if (it != delegateMap_.end()) { 
      (*it)->paint(painter, option, index); 
     } else if (var.type() != QVariant::UserType) { 
      ... 
     } else { 
      ... 
     } 
    } 

    painter->restore(); 
} 

而且bool子委託漆功能:

void Sy_boolPD::paint(QPainter* painter, 
         const QStyleOptionViewItem& option, 
         const QModelIndex& index) const 
{ 
    painter->save(); 

    bool checked = index.data().toBool(); 
    bool modified = index.data(Sy_QtPropertyModel::ModifiedRole).toBool(); 

    QStyle* style = Sy_application::style(); 
    if (modified) { 
     QStyleOptionViewItemV4 bgOpt(option); 
     bgOpt.backgroundBrush = QBrush(Sy_QtPropertyDelegate::ModifiedColour); 
     style->drawControl(QStyle::CE_ItemViewItem, &bgOpt, painter); 
    } 

    QStyleOption butOpt(option); 
    butOpt.state = QStyle::State_Enabled; 
    butOpt.state |= checked ? QStyle::State_On : QStyle::State_Off; 
    style->drawControl(QStyle::CE_CheckBox, &butOpt, painter); 

    painter->restore(); 
} 

如果我強迫modified是真實的,背景是表的顏色cout ing butOptrectstate成員顯示他們是正確的 - 但沒有顯示覆選框!將QStyle::CE_CheckBox設置爲任何其他類型也會導致無法呈現。

我已經和Qt的MVC框架合作過很多次,但是我看不出這裏出了什麼問題。

回答

0

我所要做的就是看在源代碼

case CE_CheckBox: 
    if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) { 
    ... 
    } 

QStyleOption我傳遞給該方法被轉換爲具體繪製控件的類型,CE_CheckBox需要QStyleOptionButton,如果演員失敗的繪畫操作默默跳過。