主要是CheckBoxHeaderView继承QHeaderView,重写paintSection函数
void checkStatusChange(bool);
是复选框是否选中的信号。
详细代码如下:
#ifndef CHECKBOXHEADERVIEW_H
#define CHECKBOXHEADERVIEW_H
#include
#include
#include
#include
#include
#include
/// 复选框表头
class CheckBoxHeaderView : public QHeaderView
{
Q_OBJECT
private:
int m_checkColIndex; //列下标
QPoint m_topLeft; //勾选框起始坐标
QSize m_checkSize; //勾选框大小
bool m_isChecked; //勾选框状态
public:
CheckBoxHeaderView( int checkColumnIndex, QPoint topLeft, QSize size, Qt::Orientation orientation, QWidget * parent = 0) : QHeaderView(orientation, parent)
{
m_checkColIndex = checkColumnIndex;
m_topLeft = topLeft;
m_checkSize = size;
m_isChecked = false;
}
void setCheckState(bool state)
{
m_isChecked = state;
}
protected:
void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();
if (logicalIndex == m_checkColIndex)
{
QStyleOptionButton option;
int width = 10;
for (int i=0; isetStyleSheet(sheet);
this->style()->drawControl(QStyle::CE_CheckBox, &option, painter, check);
}
}
void mousePressEvent(QMouseEvent *event)
{
if (visualIndexAt(event->pos().x()) == m_checkColIndex)
{
m_isChecked = !m_isChecked;
this->updateSection(m_checkColIndex);
emit checkStatusChange(m_isChecked);
}
QHeaderView::mousePressEvent(event);
}
signals:
void checkStatusChange(bool);
};
#endif // CHECKBOXHEADERVIEW_H
写个例子:
m_checkHeaderView = new CheckBoxHeaderView(0, QPoint(26 , 13),QSize(20 , 20 ), Qt::Horizontal, this);
m_checkHeaderView->setObjectName(QStringLiteral("m_checkHeaderView"));
ui->tbwReportNumberAdptive->setHorizontalHeader( m_checkHeaderView );
//绑定信号和槽,然后就可以实现全选功能了
connect(m_checkHeaderView, &CheckBoxHeaderView::checkStatusChange, this, &frmReport::slotCheckStatusChange);