使用QTREEVIEW中的Qcombobox委托项目
Using a QCombobox delegate item within a QTreeview
我一直在尝试利用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();
}
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何更改QComboBox项目的高度大小?
- 如何使用QTreeView在QComboBox中选择项目
- QCombobox,字符串旁边有项目的其他数据
- 在修改项目列表时,请防止可编辑的Qcombobox选择更改
- 使用QTREEVIEW中的Qcombobox委托项目
- Qcombobox设置标题文本,无论项目如何
- 向QComboBox-QT添加多个项目
- 可编辑的QComboBox:将编辑文本与项目文本同步
- 更改委托中的QComboBox项目文本
- Qt:如何在任意索引(不是当前选定的项目)处获取QComboBox项目文本
- QComboBox未正确呈现添加的项目
- 鼠标按下QComboBox的插槽-如果用户单击组合框,则动态填充项目
- QComboBox动态项目列表
- QComboBox 不显示其项目列表
- 如何在QComboBox项目中显示上标