c++ - 在 QTreeview 特定单元格中添加 QCombobox

标签 c++ qt qwidget qtreeview qcombobox

我试图仅在 QTreeview 的某些特定单元格中插入 QCombobox。在我阅读时,我认为我需要创建我的委托(delegate)(我已经创建)。但我不明白如何将其插入到我的 TreeView 中。

我想实现这一点:

enter image description here

这是我的代码:

#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(使用自定义委托(delegate))创建了一个完整的列。但我不知道如何只设置特定的单元格。谁能帮帮我?

最佳答案

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 header 。

  • 默认情况下,TreeWidgetItems 不可检查(无复选框),但使用 Qt::CheckedQt 调用 QTreeWidgetItem::setCheckState: :Unchecked 将使其可检查。

  • 默认情况下项目不可编辑。可以通过调用 treeWidgetItem->setFlags(treeWidgetItem->flags() | Qt::ItemIsEditable) 使整个可编辑。要过滤可以编辑的行/列,您可以定义自己的 itemDoubleClicked 插槽并使用 if 语句 ( example)。

关于c++ - 在 QTreeview 特定单元格中添加 QCombobox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66884904/

相关文章:

c++ - 是否有 C++ 函数来对 std::stack 进行排序?

c++ - 如何将随机(boost.random)库包装在一个类中?

c++ - MSVC++属性选项卡上的项目是什么意思?

c++ - 从另一个类转换 QString 时 QString::toInt() 失败

c++ - QMainWindow 不显示 Qwidgets 背景

C++ 初学者 - 在类内部使用类时遇到问题

c++ - 包含 Crypt32.Lib && wincrypt.h 的对 `_imp__CryptUnprotectData@28' 的 undefined reference

python - Qt:向中央小部件添加上下文菜单的最佳方法?

c++ - 如何删除小部件

c++ - 在 Qt 中的大型项目中指定构建/目标/安装路径