模型/视图/代理之间通过信号和槽进行通信,关系如下:
* 数据发生改变时,模型发出信号通知视图
* 用户对界面进行了操作,视图发出信号
* 代理发出信号告知模型和视图编辑器目前的状态
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框架)
* 数据发生改变时,模型发出信号通知视图
* 用户对界面进行了操作,视图发出信号
* 代理发出信号告知模型和视图编辑器目前的状态
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框架)