【发布时间】:2014-09-19 11:52:56
【问题描述】:
是否可以以某种方式向 QListview 中的每个项目添加一个正在删除对象 onClick 的按钮?如下图所示:
编辑:因为我是 QT 的新手,所以有一些例子可以更好地理解它。似乎有三种不同的方式?什么是最好的?使用 QAbstractItemView 吗?
【问题讨论】:
-
使用委托怎么样? (
QStyledItemDelegate)
是否可以以某种方式向 QListview 中的每个项目添加一个正在删除对象 onClick 的按钮?如下图所示:
编辑:因为我是 QT 的新手,所以有一些例子可以更好地理解它。似乎有三种不同的方式?什么是最好的?使用 QAbstractItemView 吗?
【问题讨论】:
QStyledItemDelegate)
是的。您需要使用:
QAbstractItemView::setIndexWidget ( const QModelIndex & index, QWidget * widget )
QListView 继承 QAbstractItemView 并且当您尝试自定义列表/树视图时,这通常是查看的地方。不过要小心,如果没有委托,这不会很好地扩展。看看这个帖子:http://www.qtcentre.org/threads/26916-inserting-custom-Widget-to-listview
【讨论】:
您还可以采用适用于各种容器的通用方法,包括列表视图的底层模型。
列表中的每个项目都有一个requestRemoval(Item*) 信号和一个removeMe() 槽,将X 按钮连接到每个项目构造函数中的removeMe() 槽,在removeMe() 中发出requestRemoval(this) 信号,即在创建该项目时连接到“父”对象中的removeHandler(Item*) 插槽,该项目接收请求删除的项目的指针,并将其从正在使用的底层容器中删除。
基本上,按下删除按钮会导致该特定项目将自身的指针发送到父级的删除处理程序,该处理程序会删除该条目。
编辑:请注意,这是一种通用方法,如下面的 cmets 所述,它也可以在没有信号和插槽的情况下应用,即使它可以工作,但在您的特定情况下它并不是最有效的解决方案。
【讨论】:
QObject 本身就比较大。但他的例子并没有真正暗示成千上万个对象,更不用说数百万个对象了。在这种情况下使用QObject 甚至QWidget 派生对象是可以接受的。
QObejct/信号和槽的情况下轻松使用,只需为每个项目添加一个“父”指针并在构造函数中初始化它,然后简单地调用parent->remove(this) .总成本 - 1 个指针...