QTreeView表头加checkbox,只要第一列表头文本前加checkbox,完整代码
时间: 2024-09-20 19:06:26 浏览: 30
要在QTreeView中添加列头复选框,你可以使用`QStandardItemModel`配合自定义的`QStyledItemDelegate`。下面是一个简化的例子展示了如何实现这个功能:
```cpp
#include <QApplication>
#include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QStyleOptionViewItem>
#include <QPainter>
class CheckBoxDelegate : public QStyledItemDelegate
{
public:
explicit CheckBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent)
{}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 0) // 只有第一个列才有复选框
{
bool checked = index.data(Qt::CheckStateRole).toBool();
painter->save();
// 添加复选框样式
QRect checkboxRect(option.rect);
checkboxRect.adjust(-5, -5, 5, 5); // 调整位置使其居中
drawCheckBox(painter, option, checked, checkboxRect);
painter->restore();
}
else
QStyledItemDelegate::paint(this, painter, option, index);
}
private:
void drawCheckBox(QPainter *painter, const QStyleOptionViewItem &option, bool checked, const QRect &rect) const
{
QStyle *style = QApplication::style();
style->drawPrimitive(QStyle::PE_IndicatorCheck, &option, painter, option.widget);
if (checked)
painter->setPen(option.palette.highlightedText().color());
painter->drawRect(rect);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow window;
window.setWindowTitle("QTreeView with Checkbox Header");
QStandardItemModel model;
model.setHeaderData(0, Qt::Horizontal, "Checkbox", Qt::DisplayRole); // 设置第一列标题
// 创建QTreeView并设置模型和代理
QTreeView *treeView = new QTreeView(&window);
treeView->setModel(&model);
treeView->setItemDelegate(new CheckBoxDelegate(&window));
// 示例数据,你可以根据需要替换
for (int i = 0; i < 10; ++i)
{
QStandardItem *item = new QStandardItem(QString::number(i));
item->setData(Qt::Unchecked, Qt::CheckStateRole); // 设置初始状态
model.appendRow(item);
}
window.setCentralWidget(treeView);
window.show();
return app.exec();
}
```