在这里插入代码片
# 创建主窗口类:
使用 QTableWidget 作为核心控件。
设置表头及行列信息。
自定义代理:
继承 QStyledItemDelegate,实现代理模式。
重写 paint 和 sizeHint 方法,支持多行文本绘制。
设置行高以适应多行显示。
第二行内容以红色字体显示。
文件划分:
主程序入口 main.cpp。
主窗口类定义 mainwindow.h 和 mainwindow.cpp。
自定义代理类 multilineitemdelegate.h 和 multilineitemdelegate.cpp
案例展示
据提功能代码
void MultiLineItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
painter->save();
// 获取多行文本
QString text = index.data(Qt::DisplayRole).toString();
QStringList lines = text.split('\n'); // 按行分割
// 绘制背景
if (option.state & QStyle::State_Selected) {
painter->fillRect(option.rect, option.palette.highlight());
} else {
painter->fillRect(option.rect, option.palette.base());
}
// 设置文本绘制参数
QFontMetrics fm(option.font);
int lineHeight = fm.height();
int y = option.rect.top() + (option.rect.height() - lineHeight * lines.size()) / 2;
// 绘制多行文本
for (int i = 0; i < lines.size(); ++i) {
// 第一行正常绘制
if (i == 0) {
painter->setPen(option.palette.color(QPalette::Text));
}
// 第二行使用红色字体
else if (i == 1) {
painter->setPen(Qt::red);
}
painter->drawText(option.rect.left() + 5, y + (i + 1) * lineHeight, lines[i]);
}
painter->restore();
}
详细代码如下:
main.cpp
#include "mainwindow.h"
#include <QApplication>
// 主程序入口
int main(int argc, char *argv[])
{
QApplication a(argc, argv); // 创建应用程序对象
MainWindow w; // 创建主窗口对象
w.show(); // 显示主窗口
return a.exec(); // 进入应用程序事件循环
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTableWidget>
#include "multilineitemdelegate.h"
// 主窗口类,包含一个 QTableWidget
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QTableWidget *tableWidget; // 表格控件指针
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 创建表格控件
tableWidget = new QTableWidget(this);
tableWidget->setColumnCount(6); // 设置列数
tableWidget->setRowCount(10); // 设置行数
// 设置表头
QStringList headers = {"编号", "科目类型", "人员名称", "原班级", "交接班级", "流程"};
tableWidget->setHorizontalHeaderLabels(headers);
// 创建并设置自定义代理到第二列
MultiLineItemDelegate *delegate = new MultiLineItemDelegate(this);
tableWidget->setItemDelegateForColumn(1, delegate);
// 填充表格数据
for (int row = 0; row < 10; ++row) {
for (int col = 0; col < 6; ++col) {
QTableWidgetItem *item = new QTableWidgetItem; // 创建单元格项
if (col == 1) {
item->setText("语文\n正在撤销"); // 第二列显示多行内容
} else {
item->setText(QString("Row %1 Col %2").arg(row).arg(col)); // 其他列显示测试内容
}
tableWidget->setItem(row, col, item); // 将单元格项添加到表格中
}
}
// 设置默认行高,根据字体高度调整
QFontMetrics fm(font()); // 获取默认字体指标
int rowHeight = fm.height() * 2; // 每行设置为两倍字体高度
for (int i = 0; i < tableWidget->rowCount(); ++i) {
tableWidget->setRowHeight(i, 150); // 设置行高
}
setCentralWidget(tableWidget); // 将表格控件设置为主窗口的中心部件
}
MainWindow::~MainWindow()
{
// 析构函数,释放资源
}
multilineitemdelegate.h
#ifndef MULTILINEITEMDELEGATE_H
#define MULTILINEITEMDELEGATE_H
#include <QStyledItemDelegate>
#include <QPainter>
// 自定义代理类,用于实现多行文本的绘制
class MultiLineItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit MultiLineItemDelegate(QObject *parent = nullptr);
// 重写 paint 方法,用于自定义绘制单元格内容
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
// 重写 sizeHint 方法,用于计算单元格的尺寸
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#endif // MULTILINEITEMDELEGATE_H
multilineitemdelegate.cpp
#include "multilineitemdelegate.h"
MultiLineItemDelegate::MultiLineItemDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
void MultiLineItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
painter->save(); // 保存画笔状态
// 获取单元格的多行文本
QString text = index.data(Qt::DisplayRole).toString(); // 获取数据内容
QStringList lines = text.split('\n'); // 使用换行符分割为多行
// 绘制单元格背景
if (option.state & QStyle::State_Selected) {
painter->fillRect(option.rect, option.palette.highlight()); // 选中时绘制高亮背景
} else {
painter->fillRect(option.rect, option.palette.base()); // 未选中时绘制默认背景
}
// 设置字体高度
QFontMetrics fm(option.font); // 获取字体指标
int lineHeight = fm.height(); // 每行文本的高度
// 计算文本绘制起始点,保证文本在垂直方向居中
int y = option.rect.top() + (option.rect.height() - lineHeight * lines.size()) / 2;
// 循环绘制每一行文本
for (int i = 0; i < lines.size(); ++i) {
// 设置每行文本的颜色
if (i == 0) {
painter->setPen(option.palette.color(QPalette::Text)); // 第一行使用默认颜色
} else if (i == 1) {
painter->setPen(Qt::red); // 第二行使用红色字体
}
// 绘制文本
painter->drawText(option.rect.left() + 5, y + (i + 1) * lineHeight, lines[i]);
}
painter->restore(); // 恢复画笔状态
}
QSize MultiLineItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
// 获取多行文本内容
QString text = index.data(Qt::DisplayRole).toString();
QStringList lines = text.split('\n'); // 分割为多行
// 根据行数计算单元格高度
QFontMetrics fm(option.font); // 获取字体指标
return QSize(option.rect.width(), fm.height() * lines.size());
}