1

我有一个派生视图的QStyledItemDelegate派生对象。QTableView我进一步根据模型索引数据类型委派绘画和编辑器的创建。对于bools 我想通过一个复选框来表示状态 - 但该复选框从未出现。

这是基本委托绘制函数:

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为真,则背景是表格的颜色已适当更改,并且ingcout和成员显示它们是正确的 - 但没有显示复选框!设置为任何其他类型也不会导致任何渲染。butOptrectstateQStyle::CE_CheckBox

我经常使用 Qt 的 MVC 框架,但我看不出我在哪里出错了。

4

1 回答 1

0

我所要做的就是查看源代码...

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

传递给该方法的QStyleOptionI 被强制转换为特定于绘制控件的类型,CE_CheckBox需要 a QStyleOptionButton,如果强制转换失败,则绘图操作会静默跳过。

于 2013-03-06T19:08:31.327 回答