Qt中的TreeView多级下拉框 代码实例?

以下是一个使用Qt中的TreeView实现多级下拉框的示例代码:

#include <QtWidgets>
​
class TreeViewComboBox : public QTreeView
{
    Q_OBJECT
​
public:
    explicit TreeViewComboBox(QWidget *parent = nullptr)
        : QTreeView(parent)
    {
        setHeaderHidden(true);
        setUniformRowHeights(true);
        setEditTriggers(QAbstractItemView::NoEditTriggers);
        setSelectionMode(QAbstractItemView::SingleSelection);
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
​
        connect(this, &QTreeView::clicked, this, &TreeViewComboBox::onClicked);
    }
​
    void setModel(QAbstractItemModel *model) override
    {
        QTreeView::setModel(model);
        expandAll();
    }
​
    QSize sizeHint() const override
    {
        return QSize(200, 24 * visibleItems());
    }
​
signals:
    void itemSelected(const QModelIndex &index);
​
private slots:
    void onClicked(const QModelIndex &index)
    {
        if (index.isValid()) {
            emit itemSelected(index);
            hide();
        }
    }
​
protected:
    void focusOutEvent(QFocusEvent *event) override
    {
        Q_UNUSED(event);
        hide();
    }
​
private:
    int visibleItems() const
    {
        int count = 0;
        for (int i = 0; i < model()->rowCount() && count < 10; ++i) {
            QModelIndex index = model()->index(i, 0);
            QRect rect = visualRect(index);
            if (!rect.isNull()) {
                count += rect.height();
            }
        }
        return count / rowHeight(0);
    }
};
​
class ComboBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
​
public:
    explicit ComboBoxDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent)
    {
    }
​
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const override
    {
        TreeViewComboBox *editor = new TreeViewComboBox(parent);
        return editor;
    }
​
    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        TreeViewComboBox *comboBox = qobject_cast<TreeViewComboBox *>(editor);
        if (!comboBox) {
            return;
        }
​
        QAbstractItemModel *model = index.model();
        comboBox->setModel(model);
        comboBox->setCurrentIndex(model->index(index.row(), 0));
    }
​
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        TreeViewComboBox *comboBox = qobject_cast<TreeViewComboBox *>(editor);
        if (!comboBox) {
            return;
        }
​
        QModelIndex currentIndex = comboBox->currentIndex();
        model->setData(index, currentIndex.data(), Qt::EditRole);
    }
​
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const override
    {
        editor->setGeometry(option.rect);
    }
};
​
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
​
    QStandardItemModel model(4, 1);
    for (int i = 0; i < model.rowCount(); ++i) {
        QStandardItem *item = new QStandardItem(QString("Item %1").arg(i + 1));
        item->setEditable(false);
        model.setItem(i, 0, item);
​
        for (int j = 0; j < 3; ++j) {
            QStandardItem *subItem = new QStandardItem(QString("Sub Item %1-%2").arg(i + 1).arg(j + 1));
            subItem->setEditable(false);
            item->appendRow(subItem);
​
            for (int k = 0; k < 2; ++k) {
                QStandardItem *subSubItem = new QStandardItem(QString("Sub Sub Item %1-%2-%3").arg(i + 1).arg(j + 1).arg(k + 1));
                subSubItem->setEditable(false);
                subItem->appendRow(subSubItem);
            }
        }
    }
​
    QTreeView view;
    ComboBoxDelegate delegate;
    view.setItemDelegateForColumn(0, &delegate);
    view.setModel(&model);
    view.show();
​
    return app.exec();
}
​
#include "main.moc"

在这个示例中,我们使用了一个自定义的TreeViewComboBox类作为下拉框部件,并将其设置为委托编辑器。该下拉框可以显示多级树状结构,并且支持通过单击选择树节点。

在主函数中,我们使用一个QStandardItemModel来构建一个三级嵌套的树状结构,并将其设置为TreeView的模型。我们还创建了一个ComboBoxDelegate并将其设置为第一列的委托,以便在需要时呈现TreeViewComboBox下拉框。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt,可以使用QTreeView来实现树形结构的展示,而不仅仅局限于二叉树。你可以使用QStandardItemModel来作为QTreeView的模型,并通过添加QStandardItem来构建树形结构。 首先,你需要创建一个QStandardItemModel对象,并将其导入到QTreeView。你可以使用setModel方法将模型设置到QTreeView上。 然后,你可以使用QStandardItem来创建每个节点,并将其添加到模型。可以使用QStandardItem的方法设置节点的文本、图标和其他属性。你可以使用appendRow方法将子节点添加到父节点上,从而构建树形结构。 当然,你还可以为QTreeView添加右键菜单栏和双击效应。可以通过继承QTreeView并重写相应的事件处理函数来实现这些功能。例如,可以重写contextMenuEvent方法来处理右键菜单事件,以及重写doubleClickEvent方法来处理双击事件。 总的来说,在Qt,使用QTreeView结合QStandardItemModel可以很方便地实现树形结构的展示。你可以根据自己的需求来添加节点、设置节点属性,并为QTreeView添加额外的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Qt使用的QTreeView对象实现树状链表简单显示。](https://blog.csdn.net/fangjiaze444/article/details/81569881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [qttreeView的右击事件和双击事件](https://download.csdn.net/download/Littlehero_121/12993841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值