Qt:模型视图结构

来源:互联网 发布:怎样在淘宝上找优惠券 编辑:程序博客网 时间:2024/05/29 14:00
模型/视图/代理之间通过信号和槽进行通信,关系如下:
* 数据发生改变时,模型发出信号通知视图
* 用户对界面进行了操作,视图发出信号
* 代理发出信号告知模型和视图编辑器目前的状态
InterView框架中所有的模型都基于QAbstractItemModel类,所有的视图类都从QAbstractItemView继承,
代理基于QAbstractItemDelegate抽象类,并提供了一个通用的实现类QItemDelegate.
使用已有的模型视图类:
如QStandardItemModel,QDirModel,QStringListModel,QColumnView,QHeaderView,QListView,QTableView,QTreeView
//QDirModel和QTreeView的使用:显示了磁盘上所有的目录和文件,并能够通过编辑框输入目录或文件
//直接定位响应的项目。
#ifndef DIRWIDGET_H
#define DIRWIDGET_H

#include <QWidget>
#include <QtGui>
#include <QVBoxLayout>
#include <QDirModel>
#include <QTreeView>
#include <QLineEdit>
#include <QCompleter>

class DirWidget : public QWidget
{
    Q_OBJECT

public:
    DirWidget(QWidget *parent = 0);
    ~DirWidget();
private slots:
    void pathChanged();
private:
    QModelIndex index;
    QVBoxLayout *layout;
    QDirModel *model;
    QTreeView *tree;
    QLineEdit *dirEdit;
    QCompleter *completer;//自动完成类,能够完成对输入的自动提示
};

#endif // DIRWIDGET_H
#include "dirwidget.h"
#include <QHeaderView>
DirWidget::DirWidget(QWidget *parent)
    : QWidget(parent)
{
    model = new QDirModel;
    tree = new QTreeView;
    tree->setModel(model); //
    index = model->index(QDir::currentPath()); //
    tree->expand(index);
    tree->scrollTo(index);
    tree->header()->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    completer = new QCompleter(this);
    completer->setModel(model);
    dirEdit = new QLineEdit;
    dirEdit->setText(QDir::currentPath());
    dirEdit->setCompleter(completer);
    connect(dirEdit,SIGNAL(editingFinished()),this,SLOT(pathChanged()));
    layout = new QVBoxLayout;
    layout->addWidget(tree);
    layout->addWidget(dirEdit);
    setLayout(layout);
    resize(640,480);
    setWindowTitle(QObject::tr("目录浏览"));
}

DirWidget::~DirWidget()
{
}
void DirWidget::pathChanged(){
    index = model->index(dirEdit->text());
    tree->expand(index);
    tree->scrollTo(index);
}
运行结果:


/********************************************************************************************/
相对于使用现有的模型和视图,Qt还提供了更为便捷的类来处理常见的一些数据模型:QListWidget、
QTreeWidget和QTableWidget。它们将模型和视图合一,便于处理一些常规的数据类型,这些类虽然简便,
但失去了模型/视图结构的灵活性。
eg: 
//QTableWidget,实现修改单元格的前景色、背景色、字体,并能撤销和重做(利用了Qt的Undo框架)
0 0
原创粉丝点击