我有一个MyDelegate
用于QListWidget
. 委托派生自QStyledItemDelegate
. 的目标之一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()
我可以使用的任何其他方法。
所以,问题是:如何使复选框在视觉上表现得像一个复选框?如果我需要重新实现一个复选框,那么我应该继承什么类?