gpt4 book ai didi

Qt:使用 QAbstractItemDelegate 自定义绘制的每行上的可点击 'buttons'

转载 作者:行者123 更新时间:2023-12-04 11:59:58 24 4
gpt4 key购买 nike

我想在 QListView 的每一行上绘制“可点击”图标(或按钮)我正在使用我自己的自定义“QAbstractItemDelegate”派生类进行绘制。这些按钮可能会随着行的自定义状态而改变(我可以在绘制过程中访问底层数据结构)。

解决这个问题的最佳方法是什么?

最佳答案

免责声明:这可能不是最好的方法,但这是一种您可以完全控制的方法。我们发现有必要通过绘制复选框来做到这一点。

您可以从 QStyledItemDelegate 继承(或 QAbstractItemDelegate 可能有用……没试过)并重新实现 painteditorEvent方法。您使用 QStyle::drawControl() (设置适当的样式选项后)在paint中绘制控件,然后手动测试 editorEvent 中的鼠标点击并用它做点什么。如果我没记错的话,这段代码很大程度上是从查看 QStyledItemDelegate 的 Qt 源代码中获得的灵感(咳嗽、复制、咳嗽、咳嗽)。 .

void CheckBoxDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const {
bool checked = index.model()->data(index, Qt::DisplayRole).toBool();

if (option.state & QStyle::State_Selected) {
painter->setPen(QPen(Qt::NoPen));
if (option.state & QStyle::State_Active) {
painter->setBrush(QBrush(QPalette().highlight()));
}
else {
painter->setBrush(QBrush(QPalette().color(QPalette::Inactive,
QPalette::Highlight)));
}
painter->drawRect(option.rect);
}

QStyleOptionButton check_box_style_option;
check_box_style_option.state |= QStyle::State_Enabled;
if (checked) {
check_box_style_option.state |= QStyle::State_On;
} else {
check_box_style_option.state |= QStyle::State_Off;
}
check_box_style_option.rect = CheckBoxRect(option);

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

bool CheckBoxDelegate::editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index) {
if ((event->type() == QEvent::MouseButtonRelease) ||
(event->type() == QEvent::MouseButtonDblClick)) {
QMouseEvent *mouse_event = static_cast<QMouseEvent*>(event);
if (mouse_event->button() != Qt::LeftButton ||
!CheckBoxRect(option).contains(mouse_event->pos())) {
return true;
}
if (event->type() == QEvent::MouseButtonDblClick) {
return true;
}
} else if (event->type() == QEvent::KeyPress) {
if (static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space &&
static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select) {
return false;
}
} else {
return false;
}

bool checked = model->data(index, Qt::DisplayRole).toBool();
return model->setData(index, !checked, Qt::EditRole);
}

关于Qt:使用 QAbstractItemDelegate 自定义绘制的每行上的可点击 'buttons',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476413/

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