gpt4 book ai didi

qt - QStyledItemDelegate:如何使复选框按钮在单击时更改其状态

转载 作者:行者123 更新时间:2023-12-01 15:18:45 31 4
gpt4 key购买 nike

我有一个代表MyDelegate用于QListWidget .委托(delegate)派生自 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以及我应该在哪里设置它。我尝试将其作为私有(private) bool 介绍将在 editorEvent() 中设置的变量然而,当复选框区域被点击时,它不会产生所需的行为:它设置了 ListWidget 的所有其他复选框。到相同的视觉状态。因此,它的行为类似于所有复选框的某种全局条件。

我觉得,要完成我的任务,我必须重新实现按钮并使其在单击时更改复选框状态。但是我迷路了,不知道如何解决这个问题。来自 QStyleOptionButton API我没有看到 clicked()或我可以使用的任何其他方法。

所以,问题是:如何使复选框在视觉上表现得像一个复选框?如果我需要重新实现一个复选框,那么我应该继承什么类?

最佳答案

您可以在 MyDelegate::editorEvent 中设置一些描述复选框状态的值。然后用它来绘制一个正确的复选框:

const int CHECK_ROLE = Qt::UserRole + 1;

bool MyDelegate::editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease)
{
bool value = index.data(CHECK_ROLE).toBool();

// invert checkbox state
model->setData(index, !value, CHECK_ROLE);

return true;
}

return QStyledItemDelegate::editorEvent(event, model, option, index);
}

void MyDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionButton cbOpt;
cbOpt.rect = option.rect;

bool isChecked = index.data(CHECK_ROLE).toBool();
if (isChecked)
{
cbOpt.state |= QStyle::State_On;
}
else
{
cbOpt.state |= QStyle::State_Off;
}

QApplication::style()->drawControl(QStyle::CE_CheckBox, &cbOpt, painter);
}

关于qt - QStyledItemDelegate:如何使复选框按钮在单击时更改其状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36778577/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com