qt5的mvc模型视图代理实现,9列数据,第7列包含ico图片,其中model有更新数据接口,当数据开的时候更新视图。视图只展示当前20行数据,当转到下一页时,历史页面数据所占的内存及时删除,且3,8,9列初始化数据为空,收到数据后3,8,9列才有值,当收到当前页的某行数据时,当前行变颜色。请思考一下,给出模型,视图 代理的实现
时间: 2024-03-16 14:45:37 浏览: 117
下面是一个Qt5的MVC模型视图代理实现示例,具有以下功能:
1. 使用QStandardItemModel作为数据模型,可以进行数据的增、删、改操作;
2. 第7列包含ICO图片,使用QStyledItemDelegate自定义代理来绘制图片;
3. 视图只展示20行数据,使用QTableView的setModelData()函数来设置数据模型,并使用setRowHeight()设置行高;
4. 当转到下一页时,历史页面数据所占的内存及时删除,使用QAbstractItemView的clearSpans()函数来清除历史页面的行高设置;
5. 3、8、9列初始化数据为空,可以在数据模型创建时进行设置;
6. 当收到当前页的某行数据时,当前行变颜色,使用QItemSelectionModel的setCurrentIndex()函数来设置当前行。
Model的实现如下:
```cpp
#include <QStandardItemModel>
class MyModel : public QStandardItemModel
{
public:
MyModel(QObject *parent = nullptr) : QStandardItemModel(parent)
{
setColumnCount(9);
setHeaderData(0, Qt::Horizontal, tr("Column 1"));
setHeaderData(1, Qt::Horizontal, tr("Column 2"));
setHeaderData(2, Qt::Horizontal, tr("Column 3"));
setHeaderData(3, Qt::Horizontal, tr("Column 4"));
setHeaderData(4, Qt::Horizontal, tr("Column 5"));
setHeaderData(5, Qt::Horizontal, tr("Column 6"));
setHeaderData(6, Qt::Horizontal, tr("Column 7"));
setHeaderData(7, Qt::Horizontal, tr("Column 8"));
setHeaderData(8, Qt::Horizontal, tr("Column 9"));
for (int i = 0; i < 100; i++) {
QList<QStandardItem *> rowItems;
for (int j = 0; j < 9; j++) {
QStandardItem *item = new QStandardItem;
if (j == 2 || j == 7 || j == 8) {
item->setData(QString(), Qt::DisplayRole);
} else if (j == 6) {
item->setIcon(QIcon(":/resources/icon.png"));
} else {
item->setData(QString("Row %1, Column %2").arg(i + 1).arg(j + 1), Qt::DisplayRole);
}
rowItems.append(item);
}
appendRow(rowItems);
}
}
void updateData(int row, int col, const QVariant &data)
{
if (row < 0 || row >= rowCount() || col < 0 || col >= columnCount()) {
return;
}
QStandardItem *item = itemFromIndex(index(row, col));
if (!item) {
return;
}
item->setData(data, Qt::DisplayRole);
emit dataChanged(index(row, col), index(row, col));
}
};
```
View和Delegate的实现如下:
```cpp
#include <QTableView>
#include <QItemSelectionModel>
#include <QStyledItemDelegate>
class IconDelegate : public QStyledItemDelegate
{
public:
IconDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 6) {
const QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
if (icon.isNull()) {
QStyledItemDelegate::paint(painter, option, index);
return;
}
QRect rect = option.rect;
rect.adjust(4, 4, -4, -4);
icon.paint(painter, rect);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
};
class MyTableView : public QTableView
{
public:
MyTableView(QWidget *parent = nullptr) : QTableView(parent) {}
void setModelData(MyModel *model)
{
setModel(model);
setItemDelegateForColumn(6, new IconDelegate(this));
setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionBehavior(QAbstractItemView::SelectRows);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setAlternatingRowColors(true);
setRowCount(qMin(model->rowCount(), 20));
setColumnCount(model->columnCount());
for (int i = 0; i < model->columnCount(); i++) {
setColumnWidth(i, 100);
}
setRowHeight(0, 30);
for (int i = 1; i < 20; i++) {
setRowHeight(i, 0);
}
setSpan(20, 0, model->rowCount() - 20, model->columnCount());
connect(selectionModel(), &QItemSelectionModel::currentChanged, this, &MyTableView::onCurrentChanged);
}
private slots:
void onCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
if (current.isValid()) {
setCurrentIndex(current);
}
}
};
```
使用方式:
```cpp
#include <QApplication>
#include "mymodel.h"
#include "mytableview.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyModel *model = new MyModel;
MyTableView *tableView = new MyTableView;
tableView->setModelData(model);
tableView->show();
return app.exec();
}
```
这是一个简单的示例,可以根据具体需求进行修改。
阅读全文