qt5的QTableWidget代理实现,其中有9列数据,最多20行数据,数据总页数不超过20页。列数据依次为:点号,信息描述,遥信位,动作时间,复归时间,验收时间,确认状态,确认/取消,通道类型,其中1,2,3,8,9列数据初始化有数据,其他列为空。第8列数据是ico图标。初始化的时候只加载第一页数据。 当有数据来的时候先查询数据所属页数,如果属于本页,当前页数据某行数据改变时,颜色置高亮,更新当前行的空的其他列数据,,如果不属于本页,清除当前页的数据和内存,加载新页数据,新页数据某行数据改变时,颜色置高亮,更新当前行的空的其他列数据。其中第8列数据更改图标,请思考一下,给出c++代码用例
时间: 2024-03-27 09:37:27 浏览: 128
qt 界面数据保存到Word文件和Excel文件
以下是一个简单的示例程序,用于演示如何使用QTableWidget代理实现所述功能:
```c++
#include <QApplication>
#include <QTableWidget>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QIcon>
#include <QPixmap>
class CustomDelegate : public QStyledItemDelegate {
public:
CustomDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
QStyleOptionViewItem opt = option;
// 设置当前行的背景颜色
if (opt.state & QStyle::State_Selected)
painter->fillRect(opt.rect, opt.palette.highlight());
// 设置第8列的图标
if (index.column() == 7) {
QIcon icon = qvariant_cast<QIcon>(index.data());
if (!icon.isNull()) {
QPixmap pixmap = icon.pixmap(QSize(16, 16));
painter->drawPixmap(opt.rect.center() - pixmap.rect().center(), pixmap);
}
} else {
// 如果不是第8列,则调用基类的paint方法绘制文本
QStyledItemDelegate::paint(painter, opt, index);
}
}
};
class TableWidget : public QTableWidget {
public:
TableWidget(QWidget *parent = nullptr) : QTableWidget(parent) {
// 设置列数
setColumnCount(9);
// 设置表头
QStringList headers = {"点号", "信息描述", "遥信位", "动作时间", "复归时间", "验收时间", "确认状态", "确认/取消", "通道类型"};
setHorizontalHeaderLabels(headers);
// 设置代理
CustomDelegate *delegate = new CustomDelegate(this);
setItemDelegate(delegate);
// 初始化数据
int row = 0;
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
// 偶数行初始化1、2、3、8、9列数据
QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(i));
QTableWidgetItem *item2 = new QTableWidgetItem("信息描述 " + QString::number(i));
QTableWidgetItem *item3 = new QTableWidgetItem("遥信位 " + QString::number(i));
QTableWidgetItem *item8 = new QTableWidgetItem(QIcon(":/icons/checkmark.png"), "");
QTableWidgetItem *item9 = new QTableWidgetItem("通道类型 " + QString::number(i));
setItem(row, 0, item1);
setItem(row, 1, item2);
setItem(row, 2, item3);
setItem(row, 7, item8);
setItem(row, 8, item9);
row++;
} else {
// 奇数行只初始化1、8、9列数据
QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(i));
QTableWidgetItem *item8 = new QTableWidgetItem(QIcon(":/icons/xmark.png"), "");
QTableWidgetItem *item9 = new QTableWidgetItem("通道类型 " + QString::number(i));
setItem(row, 0, item1);
setItem(row, 7, item8);
setItem(row, 8, item9);
row++;
}
}
// 设置表格大小
setRowCount(row);
setMaximumHeight(300);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
TableWidget tableWidget;
tableWidget.show();
return app.exec();
}
```
在上述代码中,我们创建了一个自定义的QStyledItemDelegate,重写了其paint方法,用于实现所述功能。在TableWidget的构造函数中,我们初始化了表格的数据,并设置了代理。其中,第8列的图标使用QIcon来进行设置,其他列的数据使用QTableWidgetItem来进行设置。在实际使用中,你需要根据自己的需求进行相应的修改。
阅读全文