我想创建相同类型的QTreeView(不是QTreeWidget)结构,如附图所示。这是QT的属性编辑器。 我使用的是QT-4.6
在第二列,根据不同的情况,我可以有旋转框,下拉或复选框或文本编辑......等等...... 请指导我如何在特定列的不同单元格中设置不同的代理。 从文档中可以看出,没有直接的API可以在单元格上设置委托(而是可用于完整小部件或行或列)。
答案 0 :(得分:3)
所有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);
}
}
答案 1 :(得分:0)
@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上,我动态创建带有计数器变量的条目,每次进入时它都是不同的...
这里,不同的组合框显示不同的条目
这种方法看起来不错吗?