2

Qt の例のリストに基づいてプロジェクトを作成し、Simple Tree Model Exampleそのモデルを編集して、いくつかの項目もチェックできるようにしました。これは次のようになります。

ここに画像の説明を入力

一部の項目を少し左に移動してほしい。そこで、派生してデリゲートを作成し、次のようQStyledItemDelegateに再実装しました。QStyledItemDelegate::paint

void TreeItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (index.column() == 0) {
        TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
        if (childItem->type() == TreeItem::Type::Checkable) {
            QStyleOptionViewItem opt = option;
            QStyledItemDelegate::initStyleOption(&opt, index);

            const int desiredThreshold = 10;

            opt.rect.setX(opt.rect.x() - desiredThreshold);
            option.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, option.widget);

            return;
        }
    }

    return QStyledItemDelegate::paint(painter, option, index);
}

このように、タイプの項目は定数の値 (この場合は 10 ピクセル)TreeItem::Type::Checkableだけ左に描画されます。desiredThreshold

ここまでは順調ですね; すべてがうまく機能し、描画が正しく行われます。でも...

問題は、項目がわずかに左に描画されているにもかかわらず (これで問題ありません)、項目がまったく移動していないかのようにマウス イベントがまだ機能していることです。仕組みは次のとおりです。

ここに画像の説明を入力

チェックボックス(アイテム全体と一緒に移動した)をクリックすると、モデルが正しく更新されるように、アイテム全体がわずかに左に描画されることをデリゲートに伝えることは可能ですか?

4

1 に答える 1