写一段代码讲述一下QT里面的mvd机制原理
时间: 2024-03-11 17:48:45 浏览: 59
以下是一个简单的示例代码,演示了QT中MVD机制的原理:
```
// 定义一个数据模型类
class MyModel : public QAbstractItemModel {
public:
// 实现父类中的纯虚函数
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(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;
private:
// 存储数据的变量
QVector<QString> m_data;
};
// 实现数据模型类中的函数
QModelIndex MyModel::index(int row, int column, const QModelIndex &parent) const {
if (!hasIndex(row, column, parent))
return QModelIndex();
// 计算索引值
int index = row * columnCount() + column;
// 返回对应索引的QModelIndex对象
return createIndex(row, column, static_cast<void*>(&m_data[index]));
}
QModelIndex MyModel::parent(const QModelIndex &child) const {
return QModelIndex();
}
int MyModel::rowCount(const QModelIndex &parent) const {
if (parent.isValid())
return 0;
return m_data.size() / columnCount();
}
int MyModel::columnCount(const QModelIndex &parent) const {
if (parent.isValid())
return 0;
return 3;
}
QVariant MyModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole || role == Qt::EditRole)
return QVariant(*static_cast<QString*>(index.internalPointer()));
return QVariant();
}
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) {
if (!index.isValid() || role != Qt::EditRole)
return false;
*static_cast<QString*>(index.internalPointer()) = value.toString();
emit dataChanged(index, index, {role});
return true;
}
// 定义一个委托类
class MyDelegate : public QStyledItemDelegate {
public:
// 实现父类中的纯虚函数
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;
};
// 实现委托类中的函数
QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
QLineEdit *editor = new QLineEdit(parent);
return editor;
}
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
QString value = index.model()->data(index, Qt::EditRole).toString();
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
lineEdit->setText(value);
}
void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
QString value = lineEdit->text();
model->setData(index, value, Qt::EditRole);
}
// 在MainWindow的构造函数中设置MVD机制
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
MyModel *model = new MyModel(this);
model->m_data = {"a", "b", "c"};
QTreeView *view = new QTreeView(this);
view->setModel(model);
MyDelegate *delegate = new MyDelegate(this);
view->setItemDelegate(delegate);
setCentralWidget(view);
}
```
这段代码创建了一个名为MyModel的数据模型类,并实现了QAbstractItemModel中的纯虚函数。数据模型类中存储了一个包含字符串的向量,可以通过索引获取其中的元素。在MainWindow的构造函数中,创建了一个包含MyModel的QTreeView,并使用MyDelegate作为其委托类,实现了对数据项的定制化显示和编辑。在运行时,用户可以通过双击某个数据项来编辑其内容,此时会调用委托类中的函数,将编辑后的数据传递给数据模型类,并更新UI以反映更改。这个示例演示了QT中MVD机制的原理,使得应用程序更易于维护和扩展。
阅读全文