如何在QTreeView中添加不同类型的委托
How to add different types of delegates in QTreeView
我想创建与附图中所示相同类型的 QTreeView(不是 QTreeWidget)结构。这是 属性 QT 编辑器。
我正在使用 QT-4.6
在第 2 列,根据不同的条件,我可以有一个旋转框,或一个下拉框或一个复选框或文本编辑...等等...
请指导我如何在特定列的不同单元格中设置不同的代表。
从文档中可以明显看出,没有直接 API 用于在单元格上设置委托(而是可用于完整的小部件或一行或一列)。
所有 QAbstractItemDelegate
方法,如 createEditor
或 paint
,都将模型索引作为其参数之一。您可以使用该索引访问模型数据并创建适当的委托小部件。当您创建模型时,您应该为将用于区分其类型的每个项目设置一些值。
一个例子:
enum DelegateType
{
DT_Text,
DT_Checkbox,
DT_Combo
}
const int MyTypeRole = Qt::UserRole + 1;
QStandardItemModel* createModel()
{
QStandardItemModel *model = new QStandardItemModel;
QStandardItem *item = new QStandardItem;
item->setText("Hello!");
item->setData(DT_Checkbox, MyTypeRole);
model->appendRow(item);
return model;
}
QWidget* MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int type = index.data(MyTypeRole).toInt();
// this is a simplified example
switch (type)
{
case DT_Text:
return new QLinedEdit;
case DT_Checkbox:
return new QCheckBox;
case DT_Combo:
return new QComboBox;
default:
return QItemDelegate::createEditor(parent, option, index);
}
}
@hank 这是对您上一条评论的回应...您看到其中有什么瑕疵吗?
MyItem* item2 = new MyItem(second);
item2->setData(delType, **MyTypeRole**);
if(delType == DT_Combo)
{
QString str1, str2, str3;
QStringList abc ;
abc << ("1" + str1.setNum(counter) ) << ("2" + str2.setNum(counter) )<< ( "3" + str3.setNum(counter) );
item2->setData(abc, MyTypeRole1);
}
QWidget* MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int type = index.data(MyTypeRole).toInt();
// this is a simplified example
switch (type)
{
case DT_Text:
return new QLinedEdit;
case DT_Combo:
{
QComboBox* cb = new QComboBox(parent);
QStringList entries - index.data(MyTypeRole1).toStringList();
cb->addItems(entries)
return cb;
}
在不同的 item2 上,我动态创建了一个带有计数器变量的条目,每次它来到这里时都是不同的......
这里,不同的组合框显示不同的条目。
您觉得这种方法好吗?
我想创建与附图中所示相同类型的 QTreeView(不是 QTreeWidget)结构。这是 属性 QT 编辑器。 我正在使用 QT-4.6
在第 2 列,根据不同的条件,我可以有一个旋转框,或一个下拉框或一个复选框或文本编辑...等等... 请指导我如何在特定列的不同单元格中设置不同的代表。 从文档中可以明显看出,没有直接 API 用于在单元格上设置委托(而是可用于完整的小部件或一行或一列)。
所有 QAbstractItemDelegate
方法,如 createEditor
或 paint
,都将模型索引作为其参数之一。您可以使用该索引访问模型数据并创建适当的委托小部件。当您创建模型时,您应该为将用于区分其类型的每个项目设置一些值。
一个例子:
enum DelegateType
{
DT_Text,
DT_Checkbox,
DT_Combo
}
const int MyTypeRole = Qt::UserRole + 1;
QStandardItemModel* createModel()
{
QStandardItemModel *model = new QStandardItemModel;
QStandardItem *item = new QStandardItem;
item->setText("Hello!");
item->setData(DT_Checkbox, MyTypeRole);
model->appendRow(item);
return model;
}
QWidget* MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int type = index.data(MyTypeRole).toInt();
// this is a simplified example
switch (type)
{
case DT_Text:
return new QLinedEdit;
case DT_Checkbox:
return new QCheckBox;
case DT_Combo:
return new QComboBox;
default:
return QItemDelegate::createEditor(parent, option, index);
}
}
@hank 这是对您上一条评论的回应...您看到其中有什么瑕疵吗?
MyItem* item2 = new MyItem(second);
item2->setData(delType, **MyTypeRole**);
if(delType == DT_Combo)
{
QString str1, str2, str3;
QStringList abc ;
abc << ("1" + str1.setNum(counter) ) << ("2" + str2.setNum(counter) )<< ( "3" + str3.setNum(counter) );
item2->setData(abc, MyTypeRole1);
}
QWidget* MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int type = index.data(MyTypeRole).toInt();
// this is a simplified example
switch (type)
{
case DT_Text:
return new QLinedEdit;
case DT_Combo:
{
QComboBox* cb = new QComboBox(parent);
QStringList entries - index.data(MyTypeRole1).toStringList();
cb->addItems(entries)
return cb;
}
在不同的 item2 上,我动态创建了一个带有计数器变量的条目,每次它来到这里时都是不同的......
这里,不同的组合框显示不同的条目。
您觉得这种方法好吗?