QListWidget的插入删除方法
2013-08-07 22:28
525 查看
QListWidget的插入删除方法
Leavea reply
已经很久没有写Blog。最近在研究Qt,正好刚刚完成了一个封装了QListWidget的小自定义Widget,中间学习到的一些东西就放在这里分享,这里面复杂(至少对于我这样的初学者很复杂)的迭代器、指针操作,往往让人晕头转向。
我是在ArchLinu x86_64的机器上完成相关代码的,Qt的版本是4.8.0。根据Qt文档,要想从一个QListWidget中获取选中的Item,需要使用selectedItems()成员函数,它的定义如下:
QList<QListWidgetItem *> selectedItems () const
尼玛,长期处理简单小巧的算法程序,极少接触容器模板这种东西的我看完这代码就呆了,这玩意太复杂了,搞了半天才弄明白这应该怎么用。
首先,QList,这是一个Qt实现的双向链表模板。由于这只是一个链表,因此不能随机访问,必须使用迭代器(坑爹啊)。然后是QListWidgetItem的指针。QListWidgetItem是QListWidget存储每一个Item的类,怎么用官方文档已经讲的很明白了,至于指针,有用Qt写过程序的人也肯定能理解为什么。于是,访问它我们需要定义这样一个迭代器:
QList<QListWidgetItem *>::const_iterator i=list.begin();
好,它是一个指针的迭代器,于是我们应当这样访问它的成员变量:
(*i)->text()
好了,这种奇葩的写法我们不看了,还是赶紧切入正题吧。我们需要插入和删除操作,至少需要他们。插入和删除的函数定义分别如下:
void addItem ( const QString & label )
void addItems ( const QStringList & labels )
void addItem ( QListWidgetItem * item ) //我们使用的添加函数
void removeItemWidget ( QListWidgetItem * item ) //删除
可是,如果你直接解引用迭代器当参数扔进去,你会发现很可能你的程序不会正确执行,无论你有多想插入、删除,什么变化都不会看见。看来事情没有那么简单。
在QListWidget中,这个对象自己保存了一个表,用来存所有Item的指针,因为Qt的所有组件都坚守一个观点:任何Qt对象都应当可以动态生成动态销毁。这就意味着两点:一,我们必须复制每个迭代器指向的QListWidgetItem才能把他们插入新的QListWidget;二,只有销毁了我们要删除的Item对象,才算是真正删除这个东西。因此我们的插入删除代码必须改成如下形式:
//插入
QListWidgetItem *newitem=new QListWidgetItem(*(*i));
List->addItem(newitem);
//删除
RightList->removeItemWidget((*i));
delete (*i);
或许从初学者角度上看,Qt这样的设计过于繁复。但事实证明,这样做不仅安全而且高效(Qt是Copy-on-write)的。而且,这样程序员也能更好地了解一些底层的问题,以方便优化。这也正是C++的特点。从应用上看,Qt的Signal-slot设计、事件处理和强大的跨平台能力是优美而完善的,但从开发上看由于C++的一些问题,它往往让初学者迷惑。看来想学Qt,必须依赖大量的代码练习。
以上代码来自plusQL,详见“关于我”->”我的开源项目”。
本文参考:limiko的blog:http://blog.csdn.net/limiko/article/details/6398985
This entry was posted in Free
Software and tagged QT on 2012
年 5 月 22 日.
相关文章推荐
- QListWidget的插入删除方法
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 在Word 2007文档中批注的插入、修改与删除方法
- C#中实现插入、删除Excel分页符的方法
- DOM中插入和删除节点(insertBefore()方法和removeChild()方法)
- 顺序表的c++实现,该模板类实现了插入,删除,清空,[]的重载等方法
- magento上插入、编辑、删除、查询语法 简便方法
- 对featureclass中插入和删除feature的几种方法进行了比较
- hibernate先删除数据,紧接着执行插入时的异常解决之道——中间不能调用flush()、clear()等方法
- datagrid 基本添加行,删除行,插入行,自定义方法
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
- JavaScript splice 方法:插入、删除或替换数组的元素
- 【20090312-02】插入和删除Featureclass中feature的几种方法(VB.Net源码)【转载】
- 解决ASP 2.0中GridView控件的删除、插入、编辑命令操作客户端确认问题的另一方法
- 浅谈Javascript--Array数组的splice()方法之删除、插入、替换
- Searsar之更新,删除,插入操作的方法命名-yellowcong
- js DOM节点的创建、插入、删除、查找、替换方法学习与总结
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- GridView提交\插入数据\删除信息后字体变大问题的解决方法