• 11656阅读
  • 17回复

QTreeView的渲染通过自定义委托实现,怎样在每一个Item上实现不同的效果 [复制链接]

上一主题 下一主题
离线phpqinsir
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-05
— 本帖被 XChinux 从 Qt图形编程 移动到本区(2013-01-09) —
情况简介:
       我模仿QQ的时候,将其用户列表用QTreeView来实现,它的每一个项是由继承QStyledItemDelegate的类来实现渲染的。我只重写了他的paint方法。
现在我有一个这样的想法:当鼠标移动到每一个Item项的时候,让背景颜色变换。不知道能否在QStyledItemDelegate的子类中实现。还是要继承QTreeView视图类再来重新实现它的单击事件。如果,是要继承QTreeView来实现的话,我已经这样做了。我在单击里面实现了单击展示的效果。现在增加一个背景色,根本行不通。


上一张效果图吧:




我只求实现的思路。我亲自去实现,再把解决后的代码或完整思路整理结贴。希望,各位大侠百忙中也来一下。谢谢!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线jdwx

只看该作者 1楼 发表于: 2012-12-05
500个item的时候卡补卡?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线phpqinsir
只看该作者 2楼 发表于: 2012-12-05
回 1楼(jdwx) 的帖子
没试过,目前有50左右。没卡。瞬间的速度。再说了,你的好友能多到哪里去呢。顶多200个吧。一般的QQ应用也只有会员能超过200.
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线kimtaikee

只看该作者 3楼 发表于: 2012-12-05
首先,我就喜欢这样问问题的,只求思路而不是像个大爷式的要求上代码。
看样子你这个是一层的TreeWidget,完全不用QTreeWidget就可以实现。
那个分组可以是个QToolButton,然后每个好友可以是有3个QLabel组成的widget,然后就是自己负责计算layout了,for example:
  1. class UserItem : public QWidget
  2. {
  3. Q_OBJECT
  4.   public:
  5.          explicit UserItem(QWidget* parent = 0);
  6.   private:
  7.          QLabel* _pixmap;
  8.          QLabel* _name;
  9.          QLabel* _descriptiveText;
  10.          QHBoxLayout* _mainLayout;
  11.          QVBoxLayout* _infoLayout;
  12. }
  13. class GroupItem : public QWidget
  14. {
  15.    Q_OBJECT
  16.    public:
  17.         explicit GroupItem(QWidget* parent = 0);
  18.          virtual ~GroupItem(){ clear(); }
  19.    public:
  20.         void setGroupName(const QString& name);
  21.         QString groupName() const;
  22.         void addUser(UserItem* item);
  23.         Container<UserItem*> users() const;
  24.         void clear();
  25. private:
  26.         QString _groupName;
  27.         Container<UserItem*> _users;
  28. }
  29. class SilumateQQTree : public QWidget
  30. {
  31.    Q_OBJECT
  32.      public:
  33.           SilumateQQTree(QWidget* parent = 0);
  34.      protected:
  35.           void resizeEvent(QResizeEvent *e);
  36.      private:
  37.           void calcGeometry(); // this is what you need to implement
  38.      private:
  39.          Container<GroupItem*> _groups;
  40. }




离线jdwx

只看该作者 4楼 发表于: 2012-12-05
回 3楼(kimtaikee) 的帖子
还需要滚动的办法?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线kimtaikee

只看该作者 5楼 发表于: 2012-12-05
回 4楼(jdwx) 的帖子
把这个控件放到QScrollArea中,QScrollArea负责了滚动这块繁琐的事情。

离线jdwx

只看该作者 6楼 发表于: 2012-12-05
千万不要用QLayout做管理工作,来管理UserItem。
因为每个QLayout的容量是127个控件。
容量不受限制就要计算pos,之后move每个UserItem。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线phpqinsir
只看该作者 7楼 发表于: 2012-12-05
回 3楼(kimtaikee) 的帖子
感谢各位的回答。我这个用QToolButton不好实现。因为,QToolButton只能展开一组。而我模仿QQ的功能是可以同时展开多组。其次,为啥QTreeView默认情况下,选中是有状态。我猜想,它的源代码里面会有类似的代码来实现颜色的交替。但是,想看它的源代码确实不好找啊。不知道还无对应的方法能实现颜色的交替。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 8楼 发表于: 2012-12-05
回 1楼(jdwx) 的帖子
刚刚我测试了2000+的Item,一点也不卡。速度瞬间的感觉。我是把这些数据全部保存到SQLite数据库中的。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 9楼 发表于: 2012-12-06
我自己想到了一个办法:用QTreeView进行区域重绘。即鼠标选中某一个Item的时候,把这个Item的Rect值拿到。然后,地这个选择这个区域进行重绘。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线jdwx

只看该作者 10楼 发表于: 2012-12-06
回 9楼(phpqinsir) 的帖子
paint(,option,)option里面有你需要的参数,什么都有。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线phpqinsir
只看该作者 11楼 发表于: 2012-12-11
关于这个问题,我最终还是选择了强大的QGraphics这个图形视图框架。它能满足我的要求。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 12楼 发表于: 2012-12-11
回 10楼(jdwx) 的帖子
今天通过仔细回味代码,以及查看了官方自带的QGraphics的例子。最终发现,我走的路子是对的。不用QGraphics,利于QTreeView完全能做出像QQ那样的感觉。只是相对于QGraphics来说,QTreeView要稍等复杂一些。因为,要在自己实现QTreeView类里面的双击。而,QGraphics全部放到了Item中。容易管理。希望,遇到同样问题的朋友可以借鉴。谢谢大家帮助!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线jdwx

只看该作者 13楼 发表于: 2012-12-11
其实用QTreeView做比较简单,以前类似的都用QWidget自己做个控件放进QListWidget里,非常灵活,但是就是数量不能多超过200个就会导致程序启动缓慢。中间那列就是。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线phpqinsir
只看该作者 14楼 发表于: 2012-12-11
回 13楼(jdwx) 的帖子
不可能吧。我用QtreeView,200个Item都瞬间的速度。用SQlite做的数据存储。我觉得可能是不是你在某个位置放了网络连接的代码,或者IO较大的操作。不然,只是显示的话,速度进学顺畅的。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线jdwx

只看该作者 15楼 发表于: 2012-12-11
用QListWidget放进200个widget一定会启动缓慢,但是启动之后滚动不卡,200个和20个区别很大,你可以试试,往一个QListWidget里放200个QPushButton或者更多。如果只是显示文本不放QWidget,2000个文本立即完成。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cyuyuanc
只看该作者 16楼 发表于: 2012-12-23
离线彩阳

只看该作者 17楼 发表于: 2012-12-26
回 15楼(jdwx) 的帖子
可以放出demo,给我们测试一下。
上海Qt开发联盟,热忱地欢迎你的加入!
快速回复
限100 字节
 
上一个 下一个