QT视图模型委托项目案例
时间: 2023-07-21 07:07:26 浏览: 54
视图模型委托是一种在Qt中实现界面和数据分离的方法。下面是一个简单的示例项目,演示如何使用视图模型委托。
首先,我们需要创建一个模型类,用于存储数据。我们可以使用Qt自带的QStandardItemModel类,也可以自定义一个模型类。在这个示例中,我们使用QStandardItemModel类。
```c++
#include <QStandardItemModel>
class MyModel : public QStandardItemModel
{
public:
MyModel(QObject *parent = nullptr);
private:
void setupModelData();
};
```
在构造函数中,我们调用setupModelData()函数来初始化模型数据。
```c++
MyModel::MyModel(QObject *parent)
: QStandardItemModel(parent)
{
setupModelData();
}
void MyModel::setupModelData()
{
// 添加表头
setHorizontalHeaderItem(0, new QStandardItem("姓名"));
setHorizontalHeaderItem(1, new QStandardItem("年龄"));
setHorizontalHeaderItem(2, new QStandardItem("性别"));
// 添加数据
QList<QStandardItem *> row1;
row1.append(new QStandardItem("张三"));
row1.append(new QStandardItem("20"));
row1.append(new QStandardItem("男"));
appendRow(row1);
QList<QStandardItem *> row2;
row2.append(new QStandardItem("李四"));
row2.append(new QStandardItem("25"));
row2.append(new QStandardItem("女"));
appendRow(row2);
QList<QStandardItem *> row3;
row3.append(new QStandardItem("王五"));
row3.append(new QStandardItem("30"));
row3.append(new QStandardItem("男"));
appendRow(row3);
}
```
接下来,我们需要创建一个委托类,用于定制视图的显示和编辑行为。在这个示例中,我们创建一个自定义委托类MyDelegate,并重新实现了paint()和createEditor()函数。
```c++
#include <QStyledItemDelegate>
class MyDelegate : public QStyledItemDelegate
{
public:
MyDelegate(QObject *parent = nullptr);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
```
在createEditor()函数中,我们创建了一个QLineEdit控件,并返回它的指针。在paint()函数中,我们调用了QStyledItemDelegate的默认实现,并在其基础上绘制了一个矩形和文本。
```c++
MyDelegate::MyDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget *MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QLineEdit *editor = new QLineEdit(parent);
return editor;
}
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
QRect rect = option.rect;
QString text = index.data(Qt::DisplayRole).toString();
painter->setPen(Qt::red);
painter->drawRect(rect);
painter->drawText(rect, text);
}
```
最后,我们在主窗口中创建一个QTableView控件,并设置模型和委托。
```c++
#include <QTableView>
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = nullptr);
private:
void setupTableView();
QTableView *m_tableView;
MyModel *m_model;
MyDelegate *m_delegate;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupTableView();
}
void MainWindow::setupTableView()
{
m_tableView = new QTableView(this);
m_model = new MyModel(this);
m_delegate = new MyDelegate(this);
m_tableView->setModel(m_model);
m_tableView->setItemDelegate(m_delegate);
setCentralWidget(m_tableView);
}
```
运行程序后,我们可以看到一个带有红色矩形和文本框的表格视图。当我们双击单元格时,会弹出一个可编辑的文本框。
以上就是一个简单的Qt视图模型委托项目案例。通过使用视图模型委托,我们可以将数据与界面分离,实现更好的代码结构和可维护性。