【问题标题】:How to access the QListWidget or QListWidgetItem from a QAbstractItemDelegate如何从 QAbstractItemDelegate 访问 QListWidget 或 QListWidgetItem
【发布时间】:2012-08-05 21:27:00
【问题描述】:

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

【问题讨论】:

    标签: qt list delegates paint qlistwidget


    【解决方案1】:

    我不确定,如果我正确理解了您的问题,但是如果您想访问包含您的委托的 QListWidget,那么我认为,最简单的方法是将委托的父级设置为列表小部件,并且然后在委托的任意位置获取列表小部件:

    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();
    }
    

    【讨论】:

    • 哇哦,呵呵。我可能应该停止忽略为我重新实现的类设置父级。谢谢。
    • 不客气。设置父对象真的很有用,你可以对继承自 QObject 的所有内容执行此操作 :)
    • 刚刚验证它有效 - 大约需要 8 次 parent() 调用才能得到我想要的,因为它嵌入在几个拆分器中,但效果很好:) 在错过了类似的东西之后,这就是要采取的线索休息一下!
    • 你会想要自动上升对象树并在你到达你想要的类时停止。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2011-05-11
    • 2017-06-03
    • 2011-12-17
    • 2018-02-21
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多