1 2 3 下一页 今天开始我们要看看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); }
(责任编辑:admin) |