目錄
參考:https://www.cnblogs.com/mfmdaoyou/p/6851703.html
說明
QTableWidget 是Qt中常用的表格控件,這里只是做一些簡單的功能備注,有需要的時候方便查看
(1)設置表單樣式
table_widget->setColumnCount(4); //設置列數
table_widget->horizontalHeader()->setDefaultSectionSize(150);
table_widget->horizontalHeader()->setClickable(false); //設置表頭不可點擊(默認點擊后進行排序)
//設置表頭內容
QStringList header;
header<<tr("name")<<tr("last modify time")<<tr("type")<<tr("size");
table_widget->setHorizontalHeaderLabels(header);
//設置表頭字體加粗
QFont font = this->horizontalHeader()->font();
font.setBold(true);
table_widget->horizontalHeader()->setFont(font);
table_widget->horizontalHeader()->setStretchLastSection(true); //設置充滿表寬度
table_widget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
table_widget->verticalHeader()->setDefaultSectionSize(10); //設置行高
table_widget->setFrameShape(QFrame::NoFrame); //設置無邊框
table_widget->setShowGrid(false); //設置不顯示格子線
table_widget->verticalHeader()->setVisible(false); //設置垂直頭不可見
table_widget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多選(Ctrl、Shift、 Ctrl+A都能夠)
table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); //設置選擇行為時每次選擇一行
table_widget->setColumnWidth(0, 50);//設置某一列寬度
table_widget->setColumnHidden(0, true);//設置某一列是否隱藏
table_widget->horizontalHeader()->setStretchLastSection(true);//最后一列填滿
table_widget->setEditTriggers(QAbstractItemView::NoEditTriggers); //設置不可編輯
table_widget->horizontalHeader()->resizeSection(0,150); //設置表頭第一列的寬度為150
table_widget->horizontalHeader()->setFixedHeight(25); //設置表頭的高度
table_widget->setStyleSheet("selection-background-color:lightblue;"); //設置選中背景色
table_widget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); //設置表頭背景色
//設置水平、垂直滾動欄樣式
table_widget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}QScrollBar::handle:hover{background:gray;}QScrollBar::sub-line{background:transparent;}QScrollBar::add-line{background:transparent;}");
table_widget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}QScrollBar::handle:hover{background:gray;}QScrollBar::sub-line{background:transparent;}QScrollBar::add-line{background:transparent;}");
問題1:鼠標點擊的選項出現虛框
#include "no_focus_delegate.h"
void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
QStyleOptionViewItem itemOption(option);
if (itemOption.state & QStyle::State_HasFocus)
{
itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
}
QStyledItemDelegate::paint(painter, itemOption, index);
}
table_widget->setItemDelegate(new NoFocusDelegate());
實現一個類,設置進去即可去除虛框
問題2:當表格只有一行的時候,會出現表頭塌陷的問題
//點擊表時不正確表頭行光亮(獲取焦點)
table_widget->horizontalHeader()->setHighlightSections(false);
(2)表格操作
1. 動態插入行
int row_count = table_widget->rowCount(); //獲取表單行數
table_widget->insertRow(row_count); //插入新行
QTableWidgetItem *item = new QTableWidgetItem();
QTableWidgetItem *item1 = new QTableWidgetItem();
//設置相應的圖標、文件名、最后更新時間、相應的類型、文件大小
item->setIcon(icon); //icon為調用系統的圖標。以后綴來區分
item->setText(name);
item1->setText(last_modify_time);
item2->setText(type); //type為調用系統的類型。以后綴來區分
item3->setText(size);
table_widget->setItem(row_count, 0, item);
table_widget->setItem(row_count, 1, item1);
//設置樣式為灰色
QColor color("gray");
item1->setTextColor(color);
2. 指定位置插入行
table_widget->insertRow(row); //插入新行 row為插入的位置
(3)點擊表頭觸發事件
connect(horizontalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(onHeaderClicked(int)));
(4)獲取選中內容以及行號
法一:
// QTableWidget選中全部單元格及取消選中全部單元格
tableWidget->selectAll();
tableWidget->setFocus();
int rowCount = ui->TableWidget->rowCount();
qDebug()<<"rowcount"<<rowCount;
int colCount = ui->TableWidget->columnCount();
qDebug()<<"colcount"<<colCount;
QTableWidgetSelectionRangerange(0,0,rowCount-1,colCount-1);
tableWidget->setRangeSelected(range,true);//false不選中
tableWidget->setFocus();
QList<QTableWidgetItem*> items = tableWidget->selectedItems();
int count = items.count();
for(int i = 0; i < count; i++)
{
int row = tableWidget->row(items.at(i));//獲取選中的行
QTableWidgetItem* item = items.at(i);
QString name = item->text();//獲取內容
}
法二:
QList<QTableWidgetSelectionRange> ranges = tableWidget->selectedRanges();
int count = ranges.count();
for(int i = 0; i < count; i++)
{
int topRow = ranges.at(i).topRow();
int bottomRow = ranges.at(i).bottomRow();
for(int j = topRow; j <= bottomRow; j++)
{
qDebug()<<"selectRow"<<j;
}
}
法三:
QModelIndexList selected = ui->tableView->selectionModel()->selectedRows();
int index = selected.first().row();//一行
(5)合並單元格
tableWidget->setSpan(0, 0, 3, 1) //其參數為: 要改變單元格的 1行數 2列數 要合並的 3行數 4列數