qt model view 模式例子代码
时间: 2023-03-07 10:24:11 浏览: 92
我可以举一个 Qt Model View 模式的例子来说明:#include <QApplication>
#include <QStandardItemModel>
#include <QTreeView>int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel model;
// Add data
QStandardItem *item;
item = new QStandardItem("Item 1");
model.setItem(0, 0, item);
item = new QStandardItem("Item 2");
model.setItem(0, 1, item);
// Add tree view
QTreeView *treeView = new QTreeView;
treeView->setModel(&model);
treeView->show();
return app.exec();
}
相关问题
qt mvc框架例子
Qt是一个跨平台的应用程序开发框架,提供了一套用于构建图形界面和处理逻辑的工具和库。MVC(Model-View-Controller)则是一种设计模式,用于将应用程序的数据、界面和逻辑进行分离,以便于管理和维护。
下面是一个使用Qt的MVC框架的例子:
假设我们正在开发一个简单的联系人管理程序,其中需要显示联系人列表并支持添加、删除和编辑联系人的功能。
首先,我们定义一个Contact类来表示联系人的数据模型。这个类可以包含联系人的姓名、电话号码、电子邮箱等信息。
接下来,我们创建一个继承自QAbstractTableModel的ContactTableModel类,负责提供联系人模型的数据和视图的交互。在这个类中,我们需要实现一些必要的函数,比如rowCount()、columnCount()、data()等,来返回联系人模型的行数、列数和具体数据。
然后,我们创建一个继承自QTableView的ContactTableView类,用于显示联系人列表。在这个类中,我们需要将ContactTableModel设置为其模型,并添加一些额外的功能,比如双击联系人时弹出详细信息编辑框等。
最后,我们创建一个继承自QDialog的ContactEditDialog类,用于编辑联系人的详细信息。在这个类中,我们可以添加各种输入框和按钮,然后在用户完成编辑后,将更新后的数据保存到ContactTableModel中。
通过以上的类的设计,我们可以将联系人的数据、视图和逻辑进行分离,方便我们对这些部分进行独立管理和扩展。比如,如果需要从数据库中读取联系人数据,我们只需要修改ContactTableModel类的data()函数,而不需要更改其他部分的代码。
总的来说,Qt的MVC框架提供了一种结构化的方式来开发和管理复杂的应用程序,它能够提高代码的可维护性和可扩展性。以上例子只是一个简单的示例,实际应用中可能涉及更多的功能和类的设计。
QT C++ MVD 例子
以下是一个简单的 QT C++ MVD(Model-View-Delegate)例子:
Model.h:
```cpp
#ifndef MODEL_H
#define MODEL_H
#include <QAbstractListModel>
#include <QStringList>
class Model : public QAbstractListModel
{
Q_OBJECT
public:
explicit Model(QObject *parent = nullptr);
enum {
NameRole = Qt::UserRole,
AgeRole
};
// 声明 QAbstractListModel 纯虚函数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
// 自定义函数
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
void addPerson(const QString &name, int age);
private:
struct Person {
QString name;
int age;
};
QList<Person> m_persons;
};
#endif // MODEL_H
```
Model.cpp:
```cpp
#include "Model.h"
Model::Model(QObject *parent)
: QAbstractListModel(parent)
{
}
int Model::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_persons.count();
}
QVariant Model::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
const auto &person = m_persons.at(index.row());
switch (role) {
case Qt::DisplayRole:
case NameRole:
return person.name;
case AgeRole:
return person.age;
default:
break;
}
return QVariant();
}
bool Model::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid() || role != Qt::EditRole)
return false;
auto &person = m_persons[index.row()];
switch (index.column()) {
case 0:
person.name = value.toString();
break;
case 1:
person.age = value.toInt();
break;
default:
return false;
}
emit dataChanged(index, index, {role});
return true;
}
Qt::ItemFlags Model::flags(const QModelIndex &index) const
{
auto flags = QAbstractListModel::flags(index);
if (index.isValid())
flags |= Qt::ItemIsEditable;
return flags;
}
void Model::addPerson(const QString &name, int age)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_persons.append({name, age});
endInsertRows();
}
```
Delegate.h:
```cpp
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QStyledItemDelegate>
class Delegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit Delegate(QObject *parent = nullptr);
// 声明 QStyledItemDelegate 纯虚函数
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#endif // DELEGATE_H
```
Delegate.cpp:
```cpp
#include "Delegate.h"
#include <QLineEdit>
Delegate::Delegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
{
auto editor = new QLineEdit(parent);
return editor;
}
void Delegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
const auto &text = index.model()->data(index, Qt::EditRole).toString();
auto lineEdit = static_cast<QLineEdit *>(editor);
lineEdit->setText(text);
}
void Delegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
auto lineEdit = static_cast<QLineEdit *>(editor);
const auto &text = lineEdit->text();
model->setData(index, text, Qt::EditRole);
}
void Delegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
{
editor->setGeometry(option.rect);
}
```
MainWindow.h:
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class Model;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_addButton_clicked();
private:
Ui::MainWindow *ui;
Model *m_model;
};
#endif // MAINWINDOW_H
```
MainWindow.cpp:
```cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "Model.h"
#include "Delegate.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_model(new Model(this))
{
ui->setupUi(this);
ui->tableView->setModel(m_model);
ui->tableView->setItemDelegate(new Delegate(this));
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_addButton_clicked()
{
const auto &name = ui->nameEdit->text();
const auto age = ui->ageSpinBox->value();
m_model->addPerson(name, age);
}
```
使用 QT Designer 创建一个 MainWindow.ui 界面,包含一个 QTableView 和两个 QLineEdit,一个 QSpinBox 和一个 QPushButton。
MainWindow.ui:
```
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QTableView" name="tableView">
<geometry>
<rect>
<x>20</x>
<y>20</y>
<width>600</width>
<height>300</height>
</rect>
</geometry>
</widget>
<widget class="QLineEdit" name="nameEdit">
<geometry>
<rect>
<x>20</x>
<y>350</y>
<width>200</width>
<height>20</height>
</rect>
</geometry>
</widget>
<widget class="QSpinBox" name="ageSpinBox">
<geometry>
<rect>
<x>240</x>
<y>350</y>
<width>80</width>
<height>20</height>
</rect>
</geometry>
</widget>
<widget class="QPushButton" name="addButton">
<geometry>
<rect>
<x>340</x>
<y>350</y>
<width>80</width>
<height>20</height>
</rect>
</geometry>
<property name="text">
<string>Add</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>
```
最终效果如下:
![QT C++ MVD 例子](https://img-blog.csdnimg.cn/2021070509285015.png)