我有一个QStyledItemDelegate
派生对象用于QTableView
派生的视图。我根据模型索引数据类型进一步委托绘制和编辑器创建。对于bool
我想通过复选框表示状态 - 但复选框永远不会出现。
这是基础委托绘制功能:
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
butOpt
的{{1}}和{{1}成员表明他们是正确的 - 但没有显示复选框!将rect
设置为任何其他类型也不会导致任何内容。
我经常使用Qt的MVC框架,但我无法看到我在哪里出错了。
答案 0 :(得分:0)
我所要做的就是查看源代码......
case CE_CheckBox:
if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
...
}
传递给方法的QStyleOption
转换为特定类型以绘制控件,CE_CheckBox
需要QStyleOptionButton
,如果转换失败,绘图操作将以静默方式跳过。< / p>