当前位置:主页   - 电脑 - 程序设计 - C/C++
Qt学习之路(43): QDirModel
来源:网络   作者:FinderCheng   更新时间:2011-07-04
收藏此页】    【字号    】    【打印】    【关闭

  今天我们来看一个很有用的model:QDirModel。这个model允许我们在view中显示操作系统的目录结构。这次让我们先来看看运行结果:

Qt学习之路(43): QDirModel

  这个界面很熟悉吧?不过这可不是由QFileDialog打开的哦,这是我们自己实现的。而提供这种实现支持的,就是QDirModel和QTreeView。我们来看一下代码。

  mytreeview.h

#ifndef MYLISTVIEW_H
#define MYLISTVIEW_H
#include <QtGui>
class MyTreeView : public QWidget
{
        Q_OBJECT
public:
        MyTreeView();
private:
        QDirModel *model;
        QTreeView *treeView;
private slots:
        void mkdir();
        void rm();
};
#endif // MYLISTVIEW_H
 
mytreeview.cpp
#include "mylistview.h"
MyTreeView::MyTreeView()
{
        model = new QDirModel;
        model->setReadOnly(false);
        model->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);
        treeView = new QTreeView;
        treeView->setModel(model);
        treeView->header()->setStretchLastSection(true);
        treeView->header()->setSortIndicator(0, Qt::AscendingOrder);
        treeView->header()->setSortIndicatorShown(true);
        treeView->header()->setClickable(true);
        QModelIndex index = model->index(QDir::currentPath());
        treeView->expand(index);
        treeView->scrollTo(index);
        treeView->resizeColumnToContents(0);
        QHBoxLayout *btnLayout = new QHBoxLayout;
        QPushButton *createBtn = new QPushButton(tr("Create Directory..."));
        QPushButton *delBtn = new QPushButton(tr("Remove"));
        btnLayout->addWidget(createBtn);
        btnLayout->addWidget(delBtn);
        QVBoxLayout *mainLayout = new QVBoxLayout(this);
        mainLayout->addWidget(treeView);
        mainLayout->addLayout(btnLayout);
        this->setLayout(mainLayout);
        connect(createBtn, SIGNAL(clicked()), this, SLOT(mkdir()));
        connect(delBtn, SIGNAL(clicked()), this, SLOT(rm()));
}
void MyTreeView::mkdir()
{
        QModelIndex index = treeView->currentIndex();
        if (!index.isValid()) {
                return;
        }
        QString dirName = QInputDialog::getText(this,
                                                                                        tr("Create Directory"),
                                                                                        tr("Directory name"));
        if (!dirName.isEmpty()) {
                if (!model->mkdir(index, dirName).isValid()) {
                        QMessageBox::information(this,
                                                                         tr("Create Directory"),
                                                                         tr("Failed to create the directory"));
                }
        }
}
void MyTreeView::rm()
{
        QModelIndex index = treeView->currentIndex();
        if (!index.isValid()) {
                return;
        }
        bool ok;
        if (model->fileInfo(index).isDir()) {
                ok = model->rmdir(index);
        } else {
                ok = model->remove(index);
        }
        if (!ok) {
                QMessageBox::information(this,
                                                                 tr("Remove"),
                                                                 tr("Failed to remove %1").arg(model->fileName(index)));
        }
}

编缉推荐阅读以下文章

  • Qt学习之路(47): 自定义Model之三
  • Qt学习之路(46): 自定义model之二
  • Qt学习之路(45): 自定义model之一
  • Qt学习之路(44): QSortFilterProxyModel
  • Qt学习之路(42): QStringListModel
  • Qt学习之路(41): QTableWidget
  • Qt学习之路(40): QTreeWidget
  • Qt学习之路(39): QListWidget
  • Qt学习之路(38): model-view架构
  • Qt学习之路(37): Qt容器类之关联存储容器
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明