qt5的mvc模型视图代理实现,9列数据,第7列包含ico图片,其中model有更新数据接口,当数据开的时候更新视图。视图只展示当前20行数据,当转到下一页时,历史页面数据所占的内存及时删除,且3,8,9列初始化数据为空,收到数据后3,8,9列才有值,当收到当前页的某行数据时,当前行变颜色。请思考一下,给出代码用例
时间: 2024-03-16 08:45:33 浏览: 53
Qt之模型/视图(实时更新数据)
下面是一个简单的Qt5的MVC模型视图代理实现示例,具有以下功能:
1. 使用QStandardItemModel作为数据模型,可以进行数据的增、删、改操作;
2. 第7列包含ICO图片,使用QStyledItemDelegate自定义代理来绘制图片;
3. 视图只展示20行数据,使用QTableView的setModelData()函数来设置数据模型,并使用setRowHeight()设置行高;
4. 当转到下一页时,历史页面数据所占的内存及时删除,使用QAbstractItemView的clearSpans()函数来清除历史页面的行高设置;
5. 3、8、9列初始化数据为空,可以在数据模型创建时进行设置;
6. 当收到当前页的某行数据时,当前行变颜色,使用QItemSelectionModel的setCurrentIndex()函数来设置当前行。
```cpp
#include <QApplication>
#include <QStandardItemModel>
#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(QStandardItemModel *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());
}
protected:
void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override
{
QTableView::currentChanged(current, previous);
if (current.isValid()) {
setCurrentIndex(current);
}
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel *model = new QStandardItemModel(100, 9);
for (int i = 0; i < model->rowCount(); i++) {
for (int j = 0; j < model->columnCount(); j++) {
if (j == 2 || j == 7 || j == 8) {
continue;
}
QStandardItem *item = new QStandardItem(QString("Row %1, Column %2").arg(i + 1).arg(j + 1));
if (j == 6) {
item->setIcon(QIcon(":/resources/icon.png"));
}
model->setItem(i, j, item);
}
}
MyTableView *tableView = new MyTableView;
tableView->setModelData(model);
tableView->show();
return app.exec();
}
```
这是一个简单的示例,可以根据具体需求进行修改。
阅读全文