haulm 发表于 2009-8-15 19:20:30

进阶篇 -- QTreeView 的应用

没啥好说的,看整理的练习代码吧,其中一些注释掉的部份都是某种设置或是可以实现的扩展,但比如右键菜单必需使用QWidget
才能生效,事件采用双击是因为单击事件的重定义比较困难,会影响到子项的展开操作。#include <QtGui>
#include "mainwindow.h"

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

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

TreeView::TreeView() : QTreeView()
{      
        QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
      model = new QStandardItemModel(4,2);
      model->setHeaderData(0, Qt::Horizontal, tr("服务"));
      model->setHeaderData(1, Qt::Horizontal, tr("说明"));
      QStandardItem *item1 = new QStandardItem("avahi-daemon");
      item1->setIcon(QIcon("gparted.png"));
      QStandardItem *item2 = new QStandardItem("bluetooth");
      item2->setIcon(QIcon("gparted.png"));
      QStandardItem *item3 = new QStandardItem("crond");
      QStandardItem *item4 = new QStandardItem("cups");
      model->setItem(0, 0, item1);
      model->setItem(1, 0, item2);
      model->setItem(2, 0, item3);
      model->setItem(3, 0, item4);
QStandardItem *item5 = new QStandardItem("fifth");
item4->appendRow(item5);
this->setModel(model);
//this->header()->setSortIndicatorShown(true); // optional
//this->header()->setClickable(true);
//setSelectionBehavior(QAbstractItemView::SelectItems);
//this->setSelectionMode(QAbstractItemView::SingleSelection);
//setColumnHidden(1, true);
//setContextMenuPolicy(Qt::CustomContextMenu);
//connect(this,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(showMenu(const QPoint &)));
}

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

void TreeView::iterateOverItems()
{
      QList<QStandardItem*> list = returnTheItems();
      
      foreach (QStandardItem* item, list) {
                qDebug() << item->text();
      }
}
void TreeView::mouseDoubleClickEvent(QMouseEvent *event)
{
      if (event->button() == Qt::LeftButton) {
      QModelIndex index0 = currentIndex();
      qDebug() << index0.data().toString();
    }
}

int main(int argc, char **argv)
{
      QApplication app(argc, argv);
      TreeView view;
        view.setEditTriggers(QAbstractItemView::NoEditTriggers);
      view.header()->setResizeMode(QHeaderView::ResizeToContents);
      view.resize(800,600);
      view.iterateOverItems();
      view.setWindowTitle(QObject::tr("Magic Linux 服务管理器"));
      view.show();
      return app.exec();
}


[ 本帖最后由 haulm 于 2009-8-15 19:49 编辑 ]

zy_sunshine 发表于 2009-12-27 11:02:39

怎样使某个item不能点击?
页: [1]
查看完整版本: 进阶篇 -- QTreeView 的应用