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
ここまでは順調ですね; すべてがうまく機能し、描画が正しく行われます。でも...
問題は、項目がわずかに左に描画されているにもかかわらず (これで問題ありません)、項目がまったく移動していないかのようにマウス イベントがまだ機能していることです。仕組みは次のとおりです。
チェックボックス(アイテム全体と一緒に移動した)をクリックすると、モデルが正しく更新されるように、アイテム全体がわずかに左に描画されることをデリゲートに伝えることは可能ですか?