QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5501|回复: 1

进阶篇 -- QTreeView 的应用

[复制链接]
发表于 2009-8-15 19:20:30 | 显示全部楼层 |阅读模式
没啥好说的,看整理的练习代码吧,其中一些注释掉的部份都是某种设置或是可以实现的扩展,但比如右键菜单必需使用QWidget
才能生效,事件采用双击是因为单击事件的重定义比较困难,会影响到子项的展开操作。
  1. #include <QtGui>
  2. #include "mainwindow.h"

  3. int main(int argc, char *argv[])
  4.   {
  5.     QApplication app(argc, argv);
  6. // Unindented for quoting purposes:
  7.   QStringList numbers;
  8.   numbers << "One" << "Two" << "Three" << "Four" << "Five";
  9. QAbstractItemModel *model = new QStringListModel(numbers);
  10.    //要注意的是,这里把StringListModel作为一个QAbstractItemModel来使用。这样我们就可以
  11.   //使用model中的抽象接口,而且如果将来我们用别的model代替了当前这个model,这些代码也会照样工作。
  12.   //QListView提供的列表视图足以满足当前这个model的需要了。
  13.   QListView *view = new QListView;
  14.   view->setModel(model);
  15.   view->setEditTriggers(QAbstractItemView::NoEditTriggers); //QAbstractItemView::setEditTriggers(QAbstractItemView::NoEditTriggers);
  16.   QItemSelectionModel *selectionModel = view->selectionModel();
  17.    view->show();
  18.    return app.exec();
  19. }

  20. // Qt提供的预定义model有以下几种:
  21. // QStringListModel                   存储一组字符串
  22. // QStandardItemModel            存储任意层次结构的数据
  23. // QDirModel                             对文件系统进行封装
  24. // QSqlQueryModel                   对SQL的查询结果集进行封装
  25. // QSqlTableModel                    对SQL中的table进行封装
  26. // QSqlRelationalTableModel    对带有foreign key的SQL table进行封装
  27. // QSortFilterProxyModel         对另一个model执行sort and/or filter
  28. //  model中存放的每项数据都有相应的"model index",由QModelIndex类来表示。
  29. //  每个index由三个部分构成:row,column和表明所属model的指针。对于一维的list model,column部分永远为0。
复制代码
  1. #include <QtGui>
  2. class TreeView :public QTreeView
  3. {
  4. public:
  5.         TreeView();
  6.         void iterateOverItems();
  7.         QList<QStandardItem*> returnTheItems();
  8.         void mouseDoubleClickEvent(QMouseEvent *event);
  9. private:
  10.          QStandardItemModel *model;
  11. };

  12. TreeView::TreeView() : QTreeView()
  13. {      
  14.         QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
  15.         model = new QStandardItemModel(4,2);
  16.         model->setHeaderData(0, Qt::Horizontal, tr("服务"));
  17.         model->setHeaderData(1, Qt::Horizontal, tr("说明"));
  18.         QStandardItem *item1 = new QStandardItem("avahi-daemon");
  19.         item1->setIcon(QIcon("gparted.png"));
  20.         QStandardItem *item2 = new QStandardItem("bluetooth");
  21.         item2->setIcon(QIcon("gparted.png"));
  22.         QStandardItem *item3 = new QStandardItem("crond");
  23.         QStandardItem *item4 = new QStandardItem("cups");
  24.         model->setItem(0, 0, item1);
  25.         model->setItem(1, 0, item2);
  26.         model->setItem(2, 0, item3);
  27.         model->setItem(3, 0, item4);
  28. QStandardItem *item5 = new QStandardItem("fifth");
  29. item4->appendRow(item5);
  30. this->setModel(model);
  31. //this->header()->setSortIndicatorShown(true); // optional
  32. //this->header()->setClickable(true);
  33. //setSelectionBehavior(QAbstractItemView::SelectItems);
  34. //this->setSelectionMode(QAbstractItemView::SingleSelection);
  35. //setColumnHidden(1, true);
  36. //setContextMenuPolicy(Qt::CustomContextMenu);
  37. //connect(this,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(showMenu(const QPoint &)));
  38. }

  39. QList<QStandardItem*> TreeView::returnTheItems()
  40. {
  41.         return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
  42. }

  43. void TreeView::iterateOverItems()
  44. {
  45.         QList<QStandardItem*> list = returnTheItems();
  46.       
  47.         foreach (QStandardItem* item, list) {
  48.                 qDebug() << item->text();
  49.         }
  50. }
  51. void TreeView::mouseDoubleClickEvent(QMouseEvent *event)
  52. {
  53.         if (event->button() == Qt::LeftButton) {
  54.         QModelIndex index0 = currentIndex();
  55.         qDebug() << index0.data().toString();
  56.     }
  57. }

  58. int main(int argc, char **argv)
  59. {
  60.         QApplication app(argc, argv);
  61.         TreeView view;
  62.         view.setEditTriggers(QAbstractItemView::NoEditTriggers);
  63.         view.header()->setResizeMode(QHeaderView::ResizeToContents);
  64.         view.resize(800,600);
  65.         view.iterateOverItems();
  66.         view.setWindowTitle(QObject::tr("Magic Linux 服务管理器"));
  67.         view.show();
  68.         return app.exec();
  69. }
复制代码

[ 本帖最后由 haulm 于 2009-8-15 19:49 编辑 ]
发表于 2009-12-27 11:02:39 | 显示全部楼层
怎样使某个item不能点击?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-24 17:18 , Processed in 0.051108 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表