• 6070阅读
  • 11回复

QTreeView的项实现QQ用户效果。 [复制链接]

上一主题 下一主题
离线phpqinsir
 
只看楼主 倒序阅读 楼主  发表于: 2012-11-26
最近我写了一个与QQ软件一样的软件,其他技术都解决了。唯独在使用QTreeView视图的时候,使用QStandardItem生成每一项,但是,这个类的setIcon设置的图片不能控制大小,而且,图片右边也不能除了文本设置其他的信息。所以,想问问各位高手,如何才能实现自定义的项。让我第一项像QQ列表的用户一样。谢谢!




qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线XChinux

只看该作者 1楼 发表于: 2012-11-26
写delegate,重新实现paint()方法,在里面,你想怎样画就怎样画。(代码可参考QTreeView自己的代码)

二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线phpqinsir
只看该作者 2楼 发表于: 2012-11-27
回 1楼(XChinux) 的帖子
我试试再来问你咯。这里回复响应真快!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 3楼 发表于: 2012-11-27
回 1楼(XChinux) 的帖子
我刚刚去试了。我通过自定义一个委托UserItemDelegate,继承自:QStyledItemDelegate。但是,在使用的时候,如下:
treeView->setItemDelegate(new UserItemDelegate());

它只能获取父项,子项得不到。而且,它得到的父项再多次循环输出。

不知道大侠有无很好的例子借鉴。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 4楼 发表于: 2012-11-28
回 3楼(phpqinsir) 的帖子
按照您的思路,问题已经解决。非常感谢你。为了以后遇到同样问题的朋友,我把我解决思路与方法分享一下:
有时候,我们要做一些复杂的列表的时候,想在列表(不管是树形还是表格)的每一项自定义一个外观的时候,可以继承QStyledItemDelegate这个类,然后重写里面的paint方法,如果还有需要就再重写sizeHint 方法。这样,通过在paint方法里面使用QPainter对象,可以想画啥就画啥。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线XChinux

只看该作者 5楼 发表于: 2012-11-28
可以通过paint()的index参数,确定父子关系。
如果想更加灵活些,可以创建item时,setData(xxxx, Qt::UserData + xx),
这样在paint()中通过index.data(Qt::UserData + xx)就能方便快速的确定它是哪种类型的item了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线phpqinsir
只看该作者 6楼 发表于: 2012-11-29
回 5楼(XChinux) 的帖子
大侠,您这个的确要更灵活得多。因为,setData默认提供的类型完全不够用,而且,定制起来非常麻烦。看了您的回复,茅塞顿开。但是,关于这个Qt::UserData+xx我在文档里面没有找到类似的介绍。我现在去百度谷歌一下先。非常感谢您!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 7楼 发表于: 2012-11-29
回 5楼(XChinux) 的帖子
大侠,貌似您写了一点。应该是:Qt:UserRole+xx。谢谢大侠!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 8楼 发表于: 2012-11-29
最后再给出经过@XChinux点拨之后的最佳实践:
在添加项的位置:
QStandardItem *myFrends = new QStandardItem;
            myFrends->setData(itemname, Qt::DisplayRole);
            myFrends->setData(itemname, Qt::UserRole + 1);
            myFrends->setData(imgpath, Qt::UserRole + 2);
            myFrends->setSizeHint(QSize(280, 60));
            parentItem->appendRow(myFrends);

在重写的委托的paint方法里面通过以下代码获取:
QString imgpath = index.model()->data(index, Qt::UserRole+2).toString();
    qDebug() << imgpath;
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线ffii4455

只看该作者 9楼 发表于: 2012-11-29
能不能贴张图看看效果啊
离线XChinux

只看该作者 10楼 发表于: 2012-11-29
Re:回 5楼(XChinux) 的帖子
引用第7楼phpqinsir于2012-11-29 15:26发表的 回 5楼(XChinux) 的帖子 :
大侠,貌似您写了一点。应该是:Qt:UserRole+xx。谢谢大侠!

写错了,不好意思。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线cyuyuanc
只看该作者 11楼 发表于: 2012-12-23
Mark
快速回复
限100 字节
 
上一个 下一个