1

这在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 *>());
4

1 回答 1

1

我不确定,如果我正确理解了您的问题,但是如果您想访问包含您的委托的 QListWidget,那么我认为,最简单的方法是将委托的父级设置为列表小部件,然后获取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();
}
于 2012-08-05T21:47:05.400 回答