QT开发中文网

qTreeview实现复选框的方案及详细demo

要在QTreeView中实现复选框,你可以使用自定义的代理类来处理复选框的显示和编辑。以下是一个详细的示例代码:

#include <QApplication>
#include <QStandardItemModel>
#include <QTreeView>
#include <QStyledItemDelegate>

// 自定义代理类用于显示和编辑复选框
class CheckBoxDelegate : public QStyledItemDelegate {
public:
    explicit CheckBoxDelegate(QObject* parent = nullptr)
        : QStyledItemDelegate(parent) {}

    // 重写创建编辑器方法,返回一个复选框编辑器
    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,
                          const QModelIndex& index) const override {
        Q_UNUSED(option);
        Q_UNUSED(index);

        QWidget* editor = new QWidget(parent);
        QCheckBox* checkBox = new QCheckBox(editor);
        QHBoxLayout* layout = new QHBoxLayout(editor);
        layout->addWidget(checkBox);
        layout->setAlignment(Qt::AlignCenter);
        layout->setContentsMargins(0, 0, 0, 0);
        editor->setLayout(layout);

        return editor;
    }

    // 重写设置编辑器数据方法,将模型数据与复选框关联
    void setEditorData(QWidget* editor, const QModelIndex& index) const override {
        bool checked = index.model()->data(index, Qt::CheckStateRole).toBool();
        static_cast<QCheckBox*>(editor->layout()->itemAt(0)->widget())->setChecked(checked);
    }

    // 重写更新模型数据方法,在用户编辑完成后更新模型中的数据
    void setModelData(QWidget* editor, QAbstractItemModel* model,
                      const QModelIndex& index) const override {
        bool checked = static_cast<QCheckBox*>(editor->layout()->itemAt(0)->widget())->isChecked();
        model->setData(index, checked, Qt::CheckStateRole);
    }

    // 重写绘制方法,用于显示复选框的状态
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
               const QModelIndex& index) const override {
        bool checked = index.model()->data(index, Qt::CheckStateRole).toBool();
        drawCheck(painter, option, option.rect.adjusted(4, 0, -4, 0), Qt::AlignCenter,
                  checked ? Qt::Checked : Qt::Unchecked);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QStandardItemModel model;
    for (int i = 0; i < 5; ++i) {
        QList<QStandardItem*> rowItems;
        QStandardItem* item = new QStandardItem(QString("Item %1").arg(i));
        item->setCheckable(true);
        item->setEditable(false);
        item->setCheckState(Qt::Unchecked);
        rowItems << item;
        model.appendRow(rowItems);
    }

    QTreeView treeView;
    
    CheckBoxDelegate delegate; // 创建自定义代理对象
    treeView.setItemDelegateForColumn(0, &delegate); // 设置列索引为0的列使用自定义代理
    
    treeView.setModel(&model);
    treeView.setRootIsDecorated(false); // 可以设置是否显示根节点的展开/折叠图标

    treeView.show();

    return app.exec();
}

在这个示例中,我们创建了一个QStandardItemModel,并为每一行的第一列添加了一个可选的复选框项。然后,我们通过创建一个自定义的代理类CheckBoxDelegate来处理复选框的显示和编辑。在主函数中,我们将代理对象与第一列相关联,并将模型设置给QTreeView进行显示。

运行程序后,你将看到在每个项目前面有复选框出现,你可以点击复选框来切换勾选状态。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=10294

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?