以下是一个使用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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓