QT中的model/View学习(二)

参考博客:(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来进行显示功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值