使用QTREEVIEW中的Qcombobox委托项目

Using a QCombobox delegate item within a QTreeview

本文关键字:项目 Qcombobox QTREEVIEW 中的 使用      更新时间:2023-10-16

我一直在尝试利用QT的MVC类型编程来解决我要解决的特定问题。从本质上讲,我想要一个QTREE,该Qtree的细胞填充了各种Qcomboboxes。

我已经创建了我的代表类,并且组合蛋白似乎正确填充了,此外,我正在使用ComboBoxes索引更改时要调用的自定义插槽我可以在Combobox中确定选择的索引的另一种方式。

如果有人能提供帮助,我会非常感激,我才开始与QT的MVC一起工作,我觉得自己很近,但我无法弄清楚这一点。

Heres MainWindow class executeLogicWindow.cpp

executeLogicSetupWindow::executeLogicSetupWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::executeLogicSetupWindow)
{
ui->setupUi(this);
int maxRow = 3,maxCol = 2;
treeModel = new QStandardItemModel(maxRow,maxCol,this);
treeItemDelegate = new controlObjectItemDelegate(this);
//tableView.setItemDelegateForColumn(1, delegate); // Column 0 can take any value, column 1 can only take values up to 8.
ui->dynamicObjectTreeView->setModel(treeModel);
ui->dynamicObjectTreeView->setItemDelegate(treeItemDelegate);

for(int row = 0;row< maxRow;row++)
{
    for(int col = 0;col< maxCol;col++)
    {
        QModelIndex index = treeModel->index(row,col,QModelIndex());
        //int value = (row+1) * (col+1);
        //treeModel->setData(index,QVariant(value),Qt::EditRole);
        treeModel->setData(index,"Click to Edit",Qt::EditRole);
    }
}

connect(treeModel,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(OnTreeItemCBChanged(QStandardItem *)));

ui->logicSetupTableWidget->setColumnCount(8);
ui->logicSetupTableWidget->setRowCount(1);
ui->logicSetupTableWidget->setHorizontalHeaderLabels(QString("Input Condition;Val A;Comparison;Val B;Reaction;Output Action").split(";"));
methodIndex = 0;
addComboRow(ui->logicSetupTableWidget->rowCount()-1);
}
executeLogicSetupWindow::~executeLogicSetupWindow()
{
delete ui;
}

void executeLogicSetupWindow::OnTreeItemCBChanged(QStandardItem *testItem)
{
QComboBox* combo = qobject_cast<QComboBox*>(sender());
//QComboBox* combo = qobject_cast<QComboBox*>(testItem);
QModelIndex testIndex = testItem->index();
qDebug() << testItem->index();
int row = testItem->index().row();
int col = testItem->index().column();
QVariant value = testItem->data();
//qDebug(testItem);
if (combo)
{
    qDebug("It worked");
}
else
{
    qDebug("Guess its fucked");
}
}

委托类ControlBoctdelegate.cpp

#include "controlobjectitemdelegate.h"
#include "QAbstractItemDelegate"
#include "QAbstractItemModel"

controlObjectItemDelegate::controlObjectItemDelegate(QObject *parent) :
QItemDelegate(parent)
{
}
QWidget* controlObjectItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *cellComboBox = new QComboBox(parent);
cellComboBox->addItems(QString("Test 1;Test 2;Test 3").split(";"));
return cellComboBox;
}
void controlObjectItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
int value = index.model()->data(index,Qt::EditRole).toInt();
QComboBox *cellComboBox = static_cast<QComboBox*>(editor);
cellComboBox->setCurrentIndex(value);
}
void controlObjectItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *cellComboBox = static_cast<QComboBox*>(editor);
QStringList value;
for(int i=0;i<cellComboBox->count();++i)
{
    value.append(cellComboBox->itemText(i));
}

model->setData(index, cellComboBox->currentText(), Qt::EditRole);
}
void controlObjectItemDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}

首先,您必须纠正委托的代码,在使用index.model()->data(index, Qt::EditRole)时,在方法setEditorData中,这包含一个无法转换为INT的字符串,因此您始终将其设置为index to 0,因此,当您要选择另一个选项时,第一个项目显示为选定,必须将该代码更改为以下内容:

void controlObjectItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index,Qt::EditRole).toString();
    QComboBox *cellComboBox = static_cast<QComboBox*>(editor);
    cellComboBox->setCurrentText(value);
}

没有方法可以获取委托编辑小部件,但是如果我们能获得其值,我们可以将该值存储在新角色中:

void controlObjectItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *cellComboBox = static_cast<QComboBox*>(editor);
    model->setData(index, cellComboBox->currentText(), Qt::EditRole);
    # save the index of the QComboBox in the role Qt::UserRole + 1
    model->setData(index, cellComboBox->currentIndex(), Qt::UserRole+1);
}

,然后在插槽中获得该值:

void executeLogicSetupWindow::OnTreeItemCBChanged(QStandardItem *testItem)
{
    QVariant variant = testItem->data(Qt::UserRole+1);
    if(variant.isValid()){
        qDebug()<<variant.toInt();
    }
}