MyDelegate
に使用されるデリゲートがありQListWidget
ます。デリゲートは から派生しQStyledItemDelegate
ます。の目標の 1 つは、 のMyDelegate
各行にチェックボックス ボタンを配置することですListWidget
。paint()
次のイベント内で実行されますMyDelegate
。
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
// ... drawing other delegate elements
QStyleOptionButton checkbox;
// setting up checkbox's size and position
// now draw the checkbox
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkbox, painter);
}
を指定したので、最初はチェックボックスをクリックすると自動的に状態が変わると思いましたQStyle::CE_CheckBox
。しかし、そうではありません。チェックボックスの視覚的な動作を手動で指定する必要があるようです。
データ的には、ユーザーがそのチェックボックスをクリックすると、特定の信号が発せられ、シーン データが変更されます。でこのアクションを実行しますeditorEvent()
:
bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) {
if (/* within checkbox area */)
emit this->clickedCheckbox(index);
}
}
バックエンド部分が機能します。ただし、チェックボックスボタンの視覚状態をチェックからチェック解除、およびその逆に変更する方法がわかりません。
paint()
から次のようなことを行うことで、チェックボックスの状態を手動で変更できることに気付きました。
checkbox.state = someCondition? (QStyle::State_Enabled | QStyle::State_On) :
(QStyle::State_Enabled | QStyle::State_Off) ;
QStyle::State_On/Off
チェックボックスの状態を手動で変更するトリックを行います。
しかし、それを設定する方法と、どこに設定すればよいかわかりませんsomeCondition
。bool
チェックボックス領域がクリックされたときに設定されるプライベート変数として導入しようとしましたeditorEvent()
が、目的の動作を生成しません。他のすべてのチェックボックスをListWidget
同じ視覚状態に設定します。そのため、すべてのチェックボックスのグローバル条件のように動作しました。
私の仕事を達成するには、ボタンを再実装し、クリック時にチェックボックスの状態を変更する必要があるように感じます。しかし、私はこの方法で迷子になり、問題へのアプローチ方法がわかりません。QStyleOptionButton
APIからは、clicked()
使用できるメソッドやその他のメソッドが表示されません。
問題は、チェックボックスを視覚的にチェックボックスのように動作させるにはどうすればよいかということです。チェックボックスを再実装する必要がある場合、どのクラスを継承すればよいでしょうか?