QTcombobox checkbox
时间: 2025-01-31 12:53:01 浏览: 43
### 如何在Qt ComboBox中添加复选框
为了实现带有复选框的`QComboBox`,可以自定义模型视图结构来满足需求。下面是一个简单的例子展示如何创建具有复选框功能的组合框。
#### 创建带复选框的QComboBox实例
通过继承`QStyledItemDelegate`来自定义项委托,并重写绘制和编辑事件处理程序以支持复选框显示与交互:
```cpp
#include <QApplication>
#include <QStandardItemModel>
#include <QCheckBox>
#include <QComboBox>
#include <QStyledItemDelegate>
class CheckBoxDelegate : public QStyledItemDelegate {
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
};
void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const {
QStyleOptionViewItem opt(option);
initStyleOption(&opt, index);
painter->save();
QWidget* widget = nullptr;
if (const auto comboBox = qobject_cast<QComboBox*>(opt.widget)) {
widget = comboBox;
}
if (!widget)
widget = option.widget;
if (widget && widget->style()) {
widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
bool value = index.data(Qt::CheckStateRole).toBool();
QStyleOptionButton checkbox_option;
QRect rect = widget->style()->subElementRect(
QStyle::SE_CheckBoxIndicator, &checkbox_option, widget);
checkbox_option.rect = option.rect.adjusted(0, 0, -rect.width(), 0);
checkbox_option.state |= value ? QStyle::State_On : QStyle::State_Off;
widget->style()->drawControl(QStyle::CE_CheckBox, &checkbox_option, painter, widget);
}
painter->restore();
}
```
接着设置此代理给`QComboBox`并填充数据到其内部使用的`QStringListModel`或其他类型的模型类中:
```cpp
int main(int argc, char **argv){
QApplication app(argc, argv);
QStringList items{"item1", "item2", "item3"};
QComboBox combo_box;
combo_box.setView(new QListView());
combo_box.setItemDelegate(new CheckBoxDelegate());
QStandardItemModel model(items.size(), 1);
for (int row = 0; row < items.size(); ++row) {
QStandardItem* item = new QStandardItem(items[row]);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setData(Qt::Unchecked, Qt::CheckStateRole);
model.setItem(row, 0, item);
}
combo_box.setModel(&model);
combo_box.show();
return app.exec();
}
```
上述代码展示了怎样构建一个具备多选能力的下拉列表控件[^1]。
阅读全文
相关推荐














