Qt Model/View理解(一)---构造model

模型/视图将数据和显示分开进行处理,中间通过代理做桥梁。

如果想往QCombox中添加一些子项,你会怎么做呢?除了常用的addItem方法,下面介绍通过模型/视图的方式添加,逐步理解模型/视图的使用方法。

1.首先添加一个类,继承自QAbstractListModel

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;

};

2.方法实现

//将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;
}

3.界面上的combox与model进行关联。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(200,200);

    QComboBox *combox = new QComboBox(this);
    combox->setGeometry(50,50,100,40);

    QStringList list;
    list<<"123"<<"345"<<"546"<<"apple";
    //创建model并初始化它。
    ComboxModel *model = new ComboxModel(list);

    combox->setModel(model);
}

4.最后效果

Qt Model/View理解(一)---构造model_第1张图片


你可能感兴趣的:(QT)