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

  今天开始我们要看看Qt的model-view类了。正如前面说的那样,之前三节的item class类只是Qt为了方便我们使用而封装了的一些操作。比起真正的model-view类来,那些类更易于使用,但是功能也会更简单,并且缺少实时性的支持,比如我们并不方便实现插入、删除等一些常见操作。而现在我们要说的model-view类使用起来可能会复杂一些,但是功能强大,并且在 model更新时会自动更新view,而model多是一些数据集合,因此比较便于操作。

  model-view类中,view大致有三种:list、tree和table,但是model千奇百怪,不同的业务,甚至同样的业务不同的建模都会有不同的model。为了方便使用,Qt提供了一些预定义好的model供我们使用。QStringListModel是其中最简单的一种。

  顾名思义,QStringListModel就是封装了QStringList的model。QStringList是一种很常用的数据类型,它实际上是一个字符串列表。我们可以想象,对于一个list来说,如果提供一个字符串列表形式的数据,就应该能够把这个数据展示出来。因为二者是一致的:QStringList是线性的,而list也是线性的。所以,QStringListModel很多时候都会作为QListView的model。

  下面我们来看怎么使用它们。比起前面的QListWidget,这里要使用两个类:QStringListModel和QListView,并且还有一些辅助类。不过你可以看到,即便这样复杂的工作,我们的代码也不会很多的:

  mylistview.h

#ifndef MYLISTVIEW_H
#define MYLISTVIEW_H
#include <QtGui>
class MyListView : public QWidget
{
        Q_OBJECT
public:
        MyListView();
private:
        QStringListModel *model;
        QListView *listView;
private slots:
        void insertData();
        void deleteData();
        void showData();
};
#endif // MYLISTVIEW_H
 
mylistview.cpp
#include "mylistview.h"
MyListView::MyListView()
{
        model = new QStringListModel(this);
        QStringList data;
        data << "Letter A" << "Letter B" << "Letter C";
        model->setStringList(data);
        listView = new QListView(this);
        listView->setModel(model);
        QHBoxLayout *btnLayout = new QHBoxLayout;
        QPushButton *insertBtn = new QPushButton(tr("insert"), this);
        QPushButton *delBtn = new QPushButton(tr("Delete"), this);
        QPushButton *showBtn = new QPushButton(tr("Show"), this);
        btnLayout->addWidget(insertBtn);
        btnLayout->addWidget(delBtn);
        btnLayout->addWidget(showBtn);
        QVBoxLayout *mainLayout = new QVBoxLayout(this);
        mainLayout->addWidget(listView);
        mainLayout->addLayout(btnLayout);
        this->setLayout(mainLayout);
        connect(insertBtn, SIGNAL(clicked()), this, SLOT(insertData()));
        connect(delBtn, SIGNAL(clicked()), this, SLOT(deleteData()));
        connect(showBtn, SIGNAL(clicked()), this, SLOT(showData()));
}
void MyListView::insertData()
{
        bool isOK;
        QString text = QInputDialog::getText(NULL, "Insert", "Please input new data:",
                                                                                 QLineEdit::Normal, "You are inserting new data.", &isOK);
        if(isOK) {
                int row = listView->currentIndex().row();
                model->insertRows(row, 1);
                QModelIndex index = model->index(row);
                model->setData(index, text);
                listView->setCurrentIndex(index);
                listView->edit(index);
        }
}
void MyListView::deleteData()
{        if(model->rowCount() > 1) {
                model->removeRows(listView->currentIndex().row(), 1);
        }
}
void MyListView::showData()
{
        QStringList data = model->stringList();
        QString str;
        foreach(QString s, data) {
                str += s + "\n";
        }
        QMessageBox::information(this, "Data", str);
}

编缉推荐阅读以下文章

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

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