前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt Model View 预定义模型(二)

Qt Model View 预定义模型(二)

作者头像
用户5908113
发布2019-09-18 16:30:17
1.4K0
发布2019-09-18 16:30:17
举报
文章被收录于专栏:Pou光明

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

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

QStringListModel

用于存储QString项的简单列表

QStandardItemModel

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

QFileSystemModel

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

QSqlQueryModel

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

QSqlTableModel

QSqlRelationalTableModel

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

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

程序环境:ubuntu Qt5.5.1

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

代码语言:javascript
复制
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的设置及显示效果。

代码语言:javascript
复制
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"));
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档