如何从QAbstractItemDelegate访问QListWidget或QListWidgetItem

时间:2012-08-05 21:27:00

标签: qt list delegates paint qlistwidget

这在Qt中甚至可能吗?我有一个QListWidget设置与特定绘画的委托,我试图根据我的QListWidget的父变量使委托绘制不同。我想我可以装备一些东西,只要我有一个指针,但我需要以某种方式在委托的paint()中获取它们。

我已经尝试过“hack”将指针存储在QVariant中,但它似乎没有工作,我宁愿不采用这种方法。如果我可以到指向委托代表的项目的指针,只需调用item-> listWidget(),这将是完美的,但在委托内部似乎不可能。

有没有办法解决这个问题?

另外,只是因为......尝试获取void *技巧的样本 - 如果这是唯一的方法,也许有人可能会看到我的错误。

//Parent of QListWidget
....
QListWidgetItem *item = new QListWidgetItem();
....
QVariant v = qVariantFromValue((void *) pStitchSymbolCustom);
item->setData(Qt::UserRole + 6, v);
....


//Implemented QAbstractItemDelegate
....
MyClass* p_pointer = 
    (MyClass*)(index.data(Qt::UserRole + 6).value<void *>());

1 个答案:

答案 0 :(得分:1)

我不确定,如果我理解你的问题,但如果你想访问包含你的委托的QListWidget,那么我认为,最简单的方法是将委托的父级设置为listwidget,并且然后在委托的任何一点获取listwidget:

QAbstractItemDelegate * delegate = new MyItemDelegate(myListWidget);

myListWidget.setItemDelegate(delegate);

然后在委托代码中:

QListWidget * listWidget = qobject_cast<QListWidget*>(parent());

//You can do whatever you want your list here

如果您的对象树很深,并且您希望代码是通用的而不关心所需父级的位置,则应自动提升树:

QListWidget * listWidget = 0;
QObject * object = parent();
while (object && ! listWidget) {
    // qobject_cast will succeed once the parent of the correct type is reached
    listWidget = qobject_cast<QListWidget*>(object);
    object = object->parent();
}