问题描述:
在使用QTableWidget设置水平表头时,添加checkBox作为表头的一个item,并且设置了该item的setCheckable和setCheckState属性,但是运行后发现checkBox并没有显示出来。
问题原因:
checkBox默认情况下是不会被显示出来的,需要通过重载QTableWidget的paintEvent函数来手动绘制checkBox才能显示出来。
解决方法:
继承QTableWidget,重载其paintEvent函数。
在paintEvent函数中获取checkBox的位置信息,然后手动绘制checkBox。
代码示例:
#include <QTableWidget>
#include <QPainter>
class MyTableWidget : public QTableWidget
{
public:
MyTableWidget(QWidget *parent = nullptr) : QTableWidget(parent)
{
}
protected:
void paintEvent(QPaintEvent *event) override
{
QTableWidget::paintEvent(event);
// 获取checkBox的位置信息
QRect checkBoxRect = visualRect(0, 0);
checkBoxRect.setLeft(checkBoxRect.left() + 5);
checkBoxRect.setWidth(20);
// 绘制checkBox
QPainter painter(viewport());
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::gray);
painter.drawRoundedRect(checkBoxRect, 3, 3);
if (horizontalHeaderItem(0) && horizontalHeaderItem(0)->checkState() == Qt::Checked)
{
painter.setBrush(Qt::white);
painter.drawEllipse(checkBoxRect.adjusted(3, 3, -3, -3));
}
}
};
在使用QTableWidget的地方,将其替换成MyTableWidget即可。