参考博客:(1)Qt5.5文档翻译---Model/View programming_u012160436的专栏-CSDN博客
(2)Qt Model/View理解(一)---构造model_大浪淘沙-CSDN博客
以下内容主要是参考以上的博客进行改编的
一、学会构造model,实现的功能是不再是随意拖动个按钮放在界面上,而是自己通过model的创建来进行创建个comboBox的赋值
1、首先创建个工程文件,然后我这边创建的是继承QWidget父类的ui界面工程,然后实现如下:
(1)创建个类:ComboxModel
ComboxModel.h文件中:
#ifndef COMBOXMODEL_H
#define COMBOXMODEL_H
#include <QAbstractItemModel>
class ComboxModel : public QAbstractListModel
{
Q_OBJECT
public:
ComboxModel(QStringList &_list,QObject *parent = 0);
~ComboxModel();
//QAbstractListModel 中3个必须重新实现的虚函数
int rowCount(const QModelIndex & parent = QModelIndex()) const;
int columnCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
private:
QStringList list;
};
#endif // COMBOXMODEL_H
ComboxModel.cpp文件中:
#include "comboxmodel.h"
//将QStringList中的字符串显示在combox中。
ComboxModel::ComboxModel(QStringList &_list,QObject *parent) :list(_list),QAbstractListModel(parent)
{
}
ComboxModel::~ComboxModel()
{
}
//体现model的行数,这里就是list的个数
int ComboxModel::rowCount(const QModelIndex & parent) const
{
return list.count();
}
//体现model的列数,这里只有1列
int ComboxModel::columnCount(const QModelIndex & parent) const
{
return 1;
}
//体现model中显示的数据,这里只是list中每一个子项。
QVariant ComboxModel::data(const QModelIndex & index, int role) const
{
if (Qt::DisplayRole == role)
{
return list.at(index.row());//返回list每一项
}
return QVariant::Invalid;
}
(2)widget.h文件中如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
#include <QComboBox>
#include "comboxmodel.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->resize(200,200);
//创建一个comboBox的控件
QComboBox *combox = new QComboBox(this);
combox->setGeometry(50,50,100,40);
//塞入文字
QStringList list;
list<<"one"<<"two"<<"three"<<"four";
//创建model并初始化它
ComboxModel *model = new ComboxModel(list);
combox->setModel(model);
}
Widget::~Widget()
{
delete ui;
}
main.cpp文件中:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
最后实现的效果如下:
二、学会使用delegate,主要用于通知模型和视图进行跟新的作用,例如使用tableView,然后再通过delegate在表格中创建个可编辑的lineEdit来进行显示的作用
以下博客主要参考链接实现的,原博客链接如下:Qt Model/View理解(三)---桥梁Delegate_大浪淘沙-CSDN博客
目录结构如下:
1、在类LineEditDelegate中的实现,
LineEditDelegate.h文件中如下:
#ifndef LINEEDITDELEGATE_H
#define LINEEDITDELEGATE_H
#include <QStyledItemDelegate>
#include <QLineEdit>
class LineEditDelegate : public QStyledItemDelegate
{
public:
LineEditDelegate();
QWidget *createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const;
void setEditorData(QWidget * editor, const QModelIndex & index) const;
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;
};
#endif // LINEEDITDELEGATE_H
LineEditDelegate.cpp文件中如下:
#include "lineeditdelegate.h"
//创建编辑器,这些编辑器是一些控件,如Label,LineEdit,Combox等
LineEditDelegate::LineEditDelegate()
{
}
QWidget *LineEditDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem & /*option*/, const QModelIndex & /*index*/) const
{
QLineEdit *line = new QLineEdit(parent);
return line;
}
//从model中取出数据,放到编辑器中
void LineEditDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const
{
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
QString str = index.model()->data(index,Qt::DisplayRole).toString();//获取model中的数据,角色为DisplayRole
lineEdit->setText(str);
}
//将编辑器中的数据更新到model中
void LineEditDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
{
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
model->setData(index,lineEdit->text(),Qt::EditRole);
}
2、类TableModel中:
TableModel.h文件
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractItemModel>
#define ROW 3
#define COL 2
class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
TableModel(QObject *parent = 0);
~TableModel();
//QAbstractTableModel 中3个必须重新实现的虚函数
int rowCount(const QModelIndex & parent = QModelIndex()) const;
int columnCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex & index) const;
bool setData(const QModelIndex & index, const QVariant & value, int role);
private:
int num[ROW][COL];
int nn;
};
#endif // TABLEMODEL_H
TableModel.cpp文件中:
#include "tablemodel.h"
TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
{
//二维数初始化,从100开始
nn = 100;
for(int i=0;i<ROW;++i){
for(int j=0;j<COL;++j){
num[i][j] = nn;
++nn;
}
}
}
TableModel::~TableModel()
{
}
//体现model的行数,这里有3行
int TableModel::rowCount(const QModelIndex & parent) const
{
return ROW;
}
//体现model的列数,这里有2列
int TableModel::columnCount(const QModelIndex & parent) const
{
return COL;
}
//体现model中显示的数据,这里只是num中每一个成员值
QVariant TableModel::data(const QModelIndex & index, int role) const
{
if (Qt::DisplayRole == role)
{
return num[index.row()][index.column()];//返回num二维数组中的值
}
return QVariant::Invalid;
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
flags |= Qt::ItemIsEditable;
return flags;
}
bool TableModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if (index.isValid() && role == Qt::EditRole)
{
num[index.row()][index.column()] = value.toInt();
emit dataChanged(index, index);
return true;
}
return false;
}
3、widget.h文件中:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "lineeditdelegate.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件中:
#include "widget.h"
#include "ui_widget.h"
#include "tablemodel.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
TableModel *model = new TableModel();
ui->tableView->setModel(model);
LineEditDelegate *delegate = new LineEditDelegate();
ui->tableView->setItemDelegate(delegate);
}
Widget::~Widget()
{
delete ui;
}
4、main.cpp文件中如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
注意界面上就是拖动个tableView在上面,最后实现效果如下:
双击的时候会出现lineEdit来进行显示功能