天天看點

QTableWidget表頭中增加checkbox以及QTableWidget各種小知識

作者:QT教程

QTableWidget能滿足大部分需求,但有時我們需要給QTableWidget增加一些小功能:

部分效果圖:

QTableWidget表頭中增加checkbox以及QTableWidget各種小知識

1、可以在表頭中增加checkbox,方法如下:

①、可以引用頭檔案scheckboxheaderview.h

#ifndef SCHECKBOXHEADERVIEW_H
#define SCHECKBOXHEADERVIEW_H
#include <QtGui>
#include <QPainter>
#include <QHeaderView>
#include <QStyleOptionButton>
#include <QStyle>
class SCheckBoxHeaderView : public QHeaderView
{
Q_OBJECT
private:
bool isChecked;
int m_checkColIdx;
public:
SCheckBoxHeaderView( int checkColumnIndex, Qt::Orientation orientation, QWidget * parent = 0) :
QHeaderView(orientation, parent) {
m_checkColIdx = checkColumnIndex;
isChecked = false;
}
signals:
void checkStausChange(bool);
protected:
void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const {
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();
if (logicalIndex == m_checkColIdx) {
QStyleOptionButton option;
int width = 10;
for (int i=0; i<logicalIndex; ++i)
width += sectionSize( i );
option.rect = QRect(3, 5, 21, 21);
if (isChecked)
option.state = QStyle::State_On;
else
option.state = QStyle::State_Off;
this->style()->drawControl(QStyle::CE_CheckBox, &option, painter);
}
}
void mousePressEvent(QMouseEvent *event) {
if (visualIndexAt(event->pos().x()) == m_checkColIdx) {
isChecked = !isChecked;
this->updateSection(m_checkColIdx);
emit checkStausChange(isChecked);
}
QHeaderView::mousePressEvent(event);
}
};
#endif // SCHECKBOXHEADERVIEW_H           

②、引用并使用

m_checkHeader = new SCheckBoxHeaderView(0, Qt::Horizontal, this);
this->setHorizontalHeader(m_checkHeader); // 這個this指針的父為QTableWidget
connect(m_checkHeader, &SCheckBoxHeaderView::checkStausChange, [=](bool check){
qDebug() << "is:" <<check;
});           

2、在表格中設定某列(或某行)的最小(或最大)大小

QTableWidget提供了setColumnWidth()和setRowHeight()兩個方法來設定某列(或某行)大小

QHeaderView提供了sectionResized信号,它的參數是這樣的:void sectionResized(int logicalIndex, int oldSize, int newSize);

我們可以自建類(也可以直接用上述的1中我建好的類),然後繼承(或組合)QHeaderView類,然後通過信号與槽來做處理,這裡提供了一個方法。

這裡以設定某列最小值為例:

bool m_min = false;
int m_minColumn = 0;
int m_minWidth = 20;           
// m_checkHeader 為上述1中建好的類
connect(m_checkHeader, &SCheckBoxHeaderView::sectionResized, [=](int logicalIndex, int
oldSize, int newSize){
if(m_min) {
if(m_minColumn == logicalIndex) {
if(newSize < m_minWidth) {
this->setColumnWidth(m_minColumn, m_minWidth);
}
}
}

});           
void setColumnMinWidth(int column, int width) {
this->setColumnWidth(column, width);
m_min = true;
m_minWidth = width;
m_minColumn = column;
}           

3、顯示表格線 (QTableWidget提供了此方法)

setShowGrid(true);           

4、設定表格内容不可編輯(QTableWidget提供了此方法)

setEditTriggers(QAbstractItemView::NoEditTriggers);           

5、設定表格内表頭字型加粗或者怎樣,這裡以加粗為例

QFont font = this->horizontalHeader()->font();
font.setBold(true);
this->horizontalHeader()->setFont(font); // 這個this指針的父為QTableWidget           

6、設定表頭背景色

this->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); // 這個this指針的父為QTableWidget           

7、設定表格列寬均等分

this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//使列完全填充并平分           

8、設定表格某單元塊内容,主要是QTableWidget的setCellWidget方法,用法可以參考下面的:

STableWidgetItem* title = new STableWidgetItem(row, QSize(wid - 1, 29),this);
title->setText(str);
title->setDeleteVisible(delVisible);
this->setCellWidget(row, i, title);           

這裡STableWidgetItem類是我自己建立的QWidget,可以自己添加QWidget中的内容,比如複選框、按鈕等

9、表格單元格内字型居中 QTableWidgetItem

QTableWidgetItem* item = new QTableWidgetItem(str);
item->setTextAlignment(Qt::AlignCenter);
this->setItem(row, i, item); // 這個this指針的父為QTableWidget

STableWidgetItem* title = new STableWidgetItem(row, QSize(wid - 1, 29),this);
           

【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】

點選這裡:Qt資料領取(視訊教程+文檔+代碼+項目實戰)

繼續閱讀