1

派生ビューの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にtrueにすると、背景はテーブルの色が適切に変更され、ingcoutとメンバーはそれらが正しいことを示しますが、チェックボックスは表示されません。他のタイプに設定しても、何もレンダリングされません。butOptrectstateQStyle::CE_CheckBox

私はQtのMVCフレームワークを頻繁に使用しましたが、ここでどこが間違っているのかわかりません。

4

1 に答える 1

0

私がしなければならなかったのは、ソースコードを調べることだけでした...

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

メソッドに渡す I は、コントロールのQStyleOption描画に固有の型にキャストされ、CE_CheckBoxが必要QStyleOptionButtonです。キャストが失敗すると、描画操作はサイレントにスキップされます。

于 2013-03-06T19:08:31.327 に答える