c++ - 在 QTreeview 特定单元格中添加 QCombobox
问题描述
我试图仅在我的 QTreeview 的某些特定单元格中插入一个 QCombobox。当我阅读时,我认为我需要创建我的委托(我已经创建)。但我不明白如何在我的树视图中插入它。
我想意识到这一点:
这是我的代码:
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include "mainwindow.h"
#include "comboboxdelegate.h"
const int ROWS = 2;
const int COLUMNS = 3;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
treeView = new QTreeView(this);
setCentralWidget(treeView);
standardModel = new QStandardItemModel ;
standardModel->setColumnCount(2);
QStandardItem *root = new QStandardItem("ROOT");
root->setCheckable(true);
root->setCheckState(Qt::Checked);
root->setEditable(false);
standardModel->setItem(0, 0, root);
QList< QStandardItem * > listOne ;
QStandardItem *f1 = new QStandardItem( "Field_1" );
f1->setCheckable(true);
f1->setCheckState(Qt::Checked);
f1->setEditable(false);
listOne.append(f1) ;
listOne.append( new QStandardItem( "<Free text>" ) ) ;
root->appendRow(listOne);
QList< QStandardItem * > listTwo ;
QStandardItem *f2 = new QStandardItem( "Field_2" );
listTwo.append(f2) ;
listTwo.append( new QStandardItem( "<HERE COMBOBOX!>" ) ) ;
root->appendRow(listTwo);
treeView->setModel(standardModel);
treeView->expandAll();
}
我设法用 QCombobox 创建了一个完整的列(使用自定义委托)。但我不知道如何只设置特定的单元格。任何人都可以帮助我吗?
解决方案
QTreeWidget使小部件项目变得方便。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
treeWidget = new QTreeWidget(this);
setCentralWidget(treeWidget);
treeWidget->setColumnCount(2);
auto root = new QTreeWidgetItem({"Root"});
root->setCheckState(0, Qt::Checked);
treeWidget->addTopLevelItem(root);
auto child1 = new QTreeWidgetItem({"Field 1", "<Free Text>"});
child1->setCheckState(0, Qt::Checked);
child1->setFlags(child1->flags() | Qt::ItemIsEditable);
root->addChild(child1);
auto child2 = new QTreeWidgetItem({"Field 2"});
child2->setFlags(child2->flags() | Qt::ItemIsEditable);
root->addChild(child2);
auto comboBox = new QComboBox();
comboBox->addItems({"Red", "Blue", "Yellow"});
treeWidget->setItemWidget(child2, 1, comboBox);
connect(treeWidget, &QTreeWidget::itemDoubleClicked, treeWidget, &QTreeWidget::editItem);
treeWidget->expandAll();
}
有一些差异需要注意。
你需要
QTreeWidget* treeWidget;
在你的类声明中。并包含 QTreeWidget 标头。默认情况下,TreeWidgetItems 是不可检查的(没有复选框),但
QTreeWidgetItem::setCheckState
使用Qt::Checked
or调用Qt::Unchecked
会使其成为可检查的。默认情况下,项目不可编辑。整行可以通过调用来编辑
treeWidgetItem->setFlags(treeWidgetItem->flags() | Qt::ItemIsEditable)
。要过滤可以编辑的行/列,您可以定义自己的 itemDoubleClicked 插槽并使用 if 语句(示例)。
推荐阅读
- spring - 在 Spring 中以测试模式运行时如何禁用方法?
- java - 如何将 Hibernate QueryList 转换为自定义类
- php - Composer 在调用 autoload.php 后执行脚本
- ads - 如何预测广告展示次数以避免超卖?
- bash - 如何在没有sed的情况下替换csv文件中的一行
- java - Prometheus:如何收集临时进程的内存消耗指标?
- javascript - v-for 没有正确对齐内容?
- windows - 在 .idea/* 文件中强制使用 LF 行分隔符
- javascript - 带有文本框的 MvcGrid 复选框未显示正确的文本框值
- ios - 适用于 Android 和 iOS 平台的 Ionic 3 应用程序上的 PDF 到 Base64