Qt Model View 预定义模型(二)

上次和大家分享的是在不区分模型和视图带来方便的情况下,可以直接使用Qt项视图中简便的子类,如 QListWidgetQTableWidgetQTreeWidget 等。本次和大家分享下如何使用 Qt 预定义的一些模型。

首先了解下几种预定义模型:

QStringListModel

用于存储 QString 项的简单列表

QStandardItemModel

管理更复杂的项目树结构,每个项目都可以包含任意数据

QFileSystemModel

提供有关本地文件系统中的文件和目录的信息

QSqlQueryModel

用于使用模型 / 视图约定访问数据库。

QSqlTableModel

QSqlRelationalTableModel

我自己刚开始看的时候,看到这里也是挺蒙圈的。没有直接应用的项目,看了之后印象不深,也没有自己重新总结,过后就忘得差不多了。后来比较直观的是在项目中用到了QListView做了一个简单的文件显示系统,结合 QFile 可以新建文件、删除文件、编辑文件等,算是简单的使用了一次 Model/View

这次要给大家展示的是对于同一个数据源,使用相同的Model读取数据,通过将该模型注册到不同的 View 中,所展现的效果。以及对于同一个数据源使用不同的 Model, 注册到 View 中的效果。听着会有一些绕,看程序时候会有比较直观的感受。

程序环境:ubuntu  Qt5.5.1

Ui结构是 Design tabWidget 分别有 listViewtableView 两个 View ,这两个 View 使用的是同一个数据源和相同的 Model —— QFileSystemModel 。还有一个是通过代码 inserttabWidget 中的 treeView ,它与 listViewtableView 使用的是同一个数据源,但是使用的 ModelQDirModel 。这样我们对 Model/View 就有了一个相对直观的了解。 Model 不关心数据源,数据源可以是数据库或是其他形式,根据数据的特点选择合适的 Model ,最后再根据要展现给用户的形式选取一个 View 。按照上述的结构,也就达到了 UI 、业务逻辑和数据分离的效果了。


 

mp_fileSystemModel = new QFileSystemModel;

mp_fileSystemModel->setRootPath(QDir::currentPath());、


void Widget::on_pbn_tableView_clicked()

{

ui->tableView->setModel(mp_fileSystemModel);

ui->tableView->setRootIndex(mp_fileSystemModel->index(QDir::currentPath()));

}

以上就完成了预定义文件系统模型和listView的设置,显示效果如下:

如果选取了一个文件,可以获取当前文件的索引。注意下,这里面是无法点开文件夹的。

接下来看下tableView的显示效果:

以上就是使用同一个数据源,使用不同View的显示效果。接下来的 treeView 的设置及显示效果。


 

mp_dirModel = new QDirModel;

//可编辑

mp_dirModel->setReadOnly(false);

//初始排序属性

mp_dirModel->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);


mp_treeView = new QTreeView(this);

mp_treeView->setModel(mp_dirModel);

mp_treeView->setRootIndex(mp_dirModel->index(QDir::currentPath()));

mp_treeView->header()->setStretchLastSection(true);

mp_treeView->header()->setSortIndicator(0, Qt::AscendingOrder);

mp_treeView->header()->setSortIndicatorShown(true);

mp_treeView->header()->setSectionsClickable(true);


设置treeView的模型以及treeView的View属性。


void treeView::slot_createDirectory()

{

QModelIndex index = mp_treeView->currentIndex();

if (!index.isValid())

return;


QString dirName = QInputDialog::getText(this,

tr("Create Directory"),

tr("Directory name"));

if (!dirName.isEmpty()) {

if (!mp_dirModel->mkdir(index, dirName).isValid())

QMessageBox::information(this, tr("Create Directory"),

tr("Failed to create the directory"));

}

}

添加一个新的目录。效果如图:

需要整个工程参考的小伙伴可在公众号后台留下联系方式 —— Pou 光明

欢迎大家关注公众号:

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章