目录:
(一) Qt Model/View 的简单说明 、预定义模型
(二)使用预定义模型 QstringListModel例子
(三)使用预定义模型QDirModel的例子
(四)Qt实现自定义模型基于QAbstractTableModel
(五)Qt实现自定义模型基于QAbstractItemModel
(六) Qt实现自定义委托 QDelegate
使用预定义模型 QStringListModel例子
源代码如下
Main.cpp
#include#include "teamleadersdialog.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); //字符串数组 QStringList leaders; leaders << "Stooge Viller" << "Littleface" << "B-B Eyes" << "Pruneface" << "Mrs. Pruneface" << "The Brow" << "Vitamin Flintheart" << "Flattop Sr." << "Shakey" << "Breathless Mahoney" << "Mumbles" << "Shoulders" << "Sketch Paree"; //对话框 TeamLeadersDialog dialog(leaders); dialog.show(); return app.exec(); }
teamleadersdialog.h
#ifndef TEAMLEADERSDIALOG_H #define TEAMLEADERSDIALOG_H #includeclass QDialogButtonBox; class QListView; class QStringListModel; class TeamLeadersDialog : public QDialog { Q_OBJECT public: //构造函数 TeamLeadersDialog(const QStringList &leaders, QWidget *parent = 0); QStringList leaders() const; private slots: void insert(); void del(); private: QListView *listView; QDialogButtonBox *buttonBox; QStringListModel *model; }; #endif
teamleadersdialog.cpp
#include#include "teamleadersdialog.h" TeamLeadersDialog::TeamLeadersDialog(const QStringList &leaders, QWidget *parent) : QDialog(parent) { //创建并组装一个QStringListModel model = new QStringListModel(this); model->setStringList(leaders); //创建一个QListView listView = new QListView; //设置模型 listView->setModel(model); //设置QListView编辑触发器:通过开始输入或者双击进入编辑字符串的状态 listView->setEditTriggers(QAbstractItemView::AnyKeyPressed | QAbstractItemView::DoubleClicked); // buttonBox = new QDialogButtonBox(); QPushButton *insertButton = buttonBox->addButton(tr("&Insert"), QDialogButtonBox::ActionRole); QPushButton *deleteButton = buttonBox->addButton(tr("&Delete"), QDialogButtonBox::ActionRole); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); //信号槽绑定插入、删除按钮 connect(insertButton, SIGNAL(clicked()), this, SLOT(insert())); connect(deleteButton, SIGNAL(clicked()), this, SLOT(del())); //按钮盒的ok和Cancel事件 connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); //界面竖直布局listView和buttonBox QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(listView); mainLayout->addWidget(buttonBox); //设置当前窗口的布局为mainLayout setLayout(mainLayout); setWindowTitle(tr("Team Leaders")); } //获取当前模型中的内容 QStringList TeamLeadersDialog::leaders() const { return model->stringList(); } void TeamLeadersDialog::insert() { //从列表视图得到当前项的行数 int row = listView->currentIndex().row(); //在模型中插入一个新行,并且模型会自动更新列表视图 model->insertRows(row, 1); //获取当前行在模型中的"模型索引" QModelIndex index = model->index(row); //设置刚刚插入的空白行为列表视图的当前索引 listView->setCurrentIndex(index); //设置列表视图在当前行进入编辑状态 listView->edit(index); } void TeamLeadersDialog::del() { //从目前行开始,共删除1行model数据,并自动更新列表视图 model->removeRows(listView->currentIndex().row(), 1); }