本節(jié)對應(yīng)的視頻講解:B_站_鏈_接
【QT開發(fā)筆記-基礎(chǔ)篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget(1)
QTableWidget
是 Qt
中的表格控件,可以行列的形式來展示數(shù)據(jù)
1. 屬性和方法
QTableWidget
有很多屬性和方法,完整的可查看幫助文檔。
在窗口上放置一個 QTableWidget
控件后,既可以在設(shè)計師 UI
界面來編輯屬性和添加數(shù)據(jù),也可以在代碼中動態(tài)地設(shè)置
這里列出常用的屬性和方法
1.1 行列數(shù)目、行表頭、列表頭
表格控件的第一行稱為行表頭,用于設(shè)置每一列的標題
表格控件的第一列稱為列表頭,用于設(shè)置每一行的標題,通常缺省則默認顯示行號
設(shè)置和獲取行列的數(shù)目
// 獲取/設(shè)置行的數(shù)目
int rowCount() const
void setRowCount(int rows)
// 獲取/設(shè)置列的數(shù)目
int columnCount() const
void setColumnCount(int columns)
設(shè)置行列表頭
// 設(shè)置行表頭
void setHorizontalHeaderLabels(const QStringList &labels)
// 設(shè)置列表頭 - 通常不設(shè)置,則默認為行號
void setVerticalHeaderLabels(const QStringList &labels)
設(shè)置列的寬度
// 獲取行表頭
QHeaderView *horizontalHeader() const
// 設(shè)置列的寬度
void QHeaderView::setSectionResizeMode(QHeaderView::ResizeMode mode)
其中 ResizeMode
是一個枚舉,取值如下:
- HeaderView::Interactive 0 用戶可拖動改變列寬
- QHeaderView::Fixed 2 固定列寬
- QHeaderView::Stretch 1 拉伸自適應(yīng)列寬大小
- QHeaderView::ResizeToContents 3 根據(jù)內(nèi)容設(shè)置列寬
通常,先整體設(shè)置為 QHeaderView::Stretch
, 然后根據(jù)需要對單獨的列進行設(shè)置,如下:
// 1、先設(shè)置自適應(yīng)寬度,再單獨設(shè)置某一列的寬度規(guī)則
ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //先自適應(yīng)寬度
// 2、然后,單獨設(shè)置某一列根據(jù)內(nèi)容調(diào)整寬度,或者單獨設(shè)置某一列為固定寬度
// ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->twStudent->setColumnWidth(0, 80);
1.2 單元格
每個網(wǎng)格單元稱為一個單元格。每個單元格有一個行號、列號。
在 QTableWidget
表格控件中,每一個單元格是一個 QTableWidgetItem
對象,可以設(shè)置其文字內(nèi)容等。
獲取和設(shè)置單元格
// 獲取和設(shè)置指定行列位置的單元格
QTableWidgetItem *item(int row, int column) const;
void setItem(int row, int column, QTableWidgetItem *item)
// 構(gòu)造 QTableWidgetItem
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type)
QTableWidgetItem(const QString &text, int type = Type)
單元格文本對齊方式
// 獲取和設(shè)置單元格文本的對齊方式
int textAlignment() const
void setTextAlignment(int alignment)
參數(shù) alignment
是一個枚舉類型,常用取值如下:
-
Qt::AlignLeft
(0x0001) 水平方向-左對齊 -
Qt::AlignRight
(0x0002) 水平方向-右對齊 -
Qt::AlignHCenter
(0x0004) 水平方向-居中對齊 -
Qt::AlignTop
(0x0020) 垂直方向-上對齊 -
Qt::AlignBottom
(0x0040) 垂直方向-下對齊 -
Qt::AlignVCenter
(0x0080) 垂直方向-居中對齊 -
Qt::AlignCenter
(AlignVCenter | AlignHCenter) 垂直方向和水平方向-居中對齊
上面的每一個宏,都代表 16
進制中的一位,可以進行或(|
)操作,來同時設(shè)置多個對齊方式。
單元格是否可編輯
// 獲取和設(shè)置單元格是否可編輯
QAbstractItemView::EditTriggers editTriggers() const
void setEditTriggers(QAbstractItemView::EditTriggers triggers)
這是繼承自其父類 QAbstractItemView
中的方法
其中,QAbstractItemView::EditTriggers
是一個枚舉,常用取值如下:
-
AbstractItemView::NoEditTriggers
0 不可編輯 -
QAbstractItemView::CurrentChanged
1 當切換單元格時 -
QAbstractItemView::DoubleClicked
2 當雙擊單元格時 -
QAbstractItemView::SelectedClicked
4 當單擊一個已選中的單元格時 -
QAbstractItemView::EditKeyPressed
8 當一個單元格獲取焦點,按編輯按鍵時(F2) -
QAbstractItemView::AnyKeyPressed
16 當一個單元格獲取焦點,按任意鍵時 -
QAbstractItemView::AllEditTriggers
31 以上所有條件的組合。(31 = 1|2|4|8|16)
1.3 隔行交替背景色
如下的奇數(shù)行和偶數(shù)行,它們的背景色不同,便于用戶瀏覽
// 獲取和設(shè)置是否允許隔行交替背景色
bool alternatingRowColors() const
void setAlternatingRowColors(bool enable)
這是繼承自其父類 QAbstractItemView
中的方法
1.4 選擇模式、選擇行為
所謂選擇行為,是指當點擊一個單元格時,是選中該單元格,還是選中一整行
// 獲取和設(shè)置選擇行為
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
這是繼承自其父類 QAbstractItemView
中的方法
其中 QAbstractItemView::SelectionBehavior
是一個枚舉,取值為:
QAbstractItemView::SelectItems
0 選中單元格
QAbstractItemView::SelectRows
1 選中單元格所在行
QAbstractItemView::SelectColumns
2 選中單元格所在列
所謂選擇模式,是指設(shè)置表格控件只可選擇單行、可選擇多行等。
// 獲取和設(shè)置選擇模式
QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)
這是繼承自其父類 QAbstractItemView
中的方法
其中 QAbstractItemView::SelectionMode
是一個枚舉,取值為:
-
QAbstractItemView::
NoSelection
0 不可選擇 -
QAbstractItemView::
SingleSelection
1 單行選擇,一次只允許選擇一行 -
QAbstractItemView::
MultiSelection
2 多行選擇,鼠標單擊就可以選擇多行 -
QAbstractItemView::
ExtendedSelection
3 擴展選擇,按shift鍵選中一個范圍內(nèi)的行,ctrl鍵可以選中不相鄰的行 -
QAbstractItemView::
ContiguousSelection
4 相鄰選擇,按shift鍵或ctrl鍵都可以選中一個范圍內(nèi)的行
1.5 設(shè)置樣式表
通過設(shè)置樣式表,可以使的表格控件更加美觀
void Widget::on_btnStyleSheet_clicked()
{
QString cellStyle = R"(
QTableView
{
text-align:center;
background-color: rgba(255, 255, 255, 0);
alternate-background-color:#e3edf9;
font:14px "微軟雅黑";
color:#677483;
gridline-color: #ccddf0;
}
)";
const QString horizontalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微軟雅黑";
text-align:center;
height:32px;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
const QString verticalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微軟雅黑";
width:60px;
text-align:center;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
ui->twStudent->setStyleSheet(cellStyle);
ui->twStudent->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);
ui->twStudent->verticalHeader()->setStyleSheet(verticalHeaderStyle);
}
以上 R
包裹的字符串,就是 C++
中的原始字符串
原始字符串:使用前綴 R
來標識,并用 "(
和 )"
用作定界符
就是所見即所得,不用寫難以理解的轉(zhuǎn)義字符。
2. 案例
本案例展示表格控件的以下操作:
- 行表頭的設(shè)置
- 列表頭的設(shè)置
- 交替顯示背景色
- 單元格可編輯
- 設(shè)置樣式表
- 選擇行為:單元格選擇或行選擇
- 數(shù)據(jù)的增刪改查
2.1 布局
在 UI
設(shè)計師界面,拖拽對應(yīng)的控件,修改顯示的文字、控件的 name
,然后完成布局文章來源:http://www.zghlxwxcb.cn/news/detail-530311.html
2.2 代碼實現(xiàn)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 初始化列表控件
// 1.1 共有4列,并添加列的名稱
ui->twStudent->setColumnCount(4);
QStringList horizontalHeader;
horizontalHeader << "姓名";
horizontalHeader << "性別";
horizontalHeader << "年齡";
horizontalHeader << "籍貫";
ui->twStudent->setHorizontalHeaderLabels(horizontalHeader);
// 1.2 設(shè)置列的寬度
// 先設(shè)置自適應(yīng)寬度,再單獨設(shè)置某一列的寬度規(guī)則
ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //先自適應(yīng)寬度
// 然后,可以單獨設(shè)置某一列根據(jù)內(nèi)容調(diào)整寬度
// ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
// 或者,可以單獨設(shè)置某一列為固定寬度
// ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
// ui->twStudent->setColumnWidth(0, 80);
// 1.3 添加幾行初始化數(shù)據(jù)
appendOneRow("李雷", "男", 12, "廣東");
appendOneRow("韓梅梅", "女", 11, "北京");
appendOneRow("林濤", "男", 13, "上海");
// 2. 設(shè)置行表頭是否顯示
// 首先根據(jù)在屬性窗口中設(shè)置的屬性,初始化復選框
if(ui->twStudent->horizontalHeader()->isHidden()) {
ui->cboHHeader->setChecked(false);
} else {
ui->cboHHeader->setChecked(true);
}
// 點擊復選框時,顯示或者隱藏行表頭
connect(ui->cboHHeader, &QCheckBox::stateChanged, this, [=](int state) {
if(state == Qt::Checked) {
ui->twStudent->horizontalHeader()->show();
} else if(state == Qt::Unchecked) {
ui->twStudent->horizontalHeader()->hide();
}
});
// 3. 設(shè)置列表頭是否顯示
// 首先根據(jù)在屬性窗口中設(shè)置的屬性,初始化復選框
if(ui->twStudent->verticalHeader()->isHidden()) {
ui->cboVHeader->setChecked(false);
} else {
ui->cboVHeader->setChecked(true);
}
// 點擊復選框時,顯示或者隱藏列表頭
connect(ui->cboVHeader, &QCheckBox::stateChanged, this, [=](int state) {
if(state == Qt::Checked) {
ui->twStudent->verticalHeader()->show();
} else if(state == Qt::Unchecked) {
ui->twStudent->verticalHeader()->hide();
}
});
// 4. 交替顯示行的背景色
// 首先根據(jù)在屬性窗口中設(shè)置的屬性,初始化復選框
if(ui->twStudent->alternatingRowColors()) {
ui->cboAlternate->setChecked(true);
} else {
ui->cboAlternate->setChecked(false);
}
// 點擊復選框時,使能或者禁能交替背景色
connect(ui->cboAlternate, &QCheckBox::stateChanged, this, [=](int state) {
if(state == Qt::Checked) {
ui->twStudent->setAlternatingRowColors(true);
} else if(state == Qt::Unchecked) {
ui->twStudent->setAlternatingRowColors(false);
}
});
// 5. 設(shè)置單元格是否可編輯
// 首先根據(jù)在屬性窗口中設(shè)置的屬性,初始化復選按鈕
int trigger = ui->twStudent->editTriggers();
if(trigger == QAbstractItemView::NoEditTriggers) {
ui->cboEditCell->setChecked(false);
} else {
ui->cboEditCell->setChecked(true);
}
// 點擊復選按鈕時,使能或者禁能單元格編輯
connect(ui->cboEditCell, &QCheckBox::stateChanged, this, [=](int state) {
if(state == Qt::Checked) {
// 當雙擊單元格/選中單元格然后單擊/按下編輯鍵F2,都可以編輯單元格。
ui->twStudent->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::SelectedClicked |
QAbstractItemView::EditKeyPressed);
} else if(state == Qt::Unchecked) {
ui->twStudent->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
});
// 6. 設(shè)置行選擇還是單元格選擇
// 首先根據(jù)在屬性窗口中設(shè)置的屬性,初始化單選按鈕的選中狀態(tài)
int selectionBehavior = ui->twStudent->selectionBehavior();
if(selectionBehavior == QAbstractItemView::SelectItems) {
ui->rbCell->setChecked(true);
} else if(selectionBehavior == QAbstractItemView::SelectRows){
ui->rbRow->setChecked(true);
}
// 點擊單選按鈕時,使能單元格選中或者行選中
mButtonGroupSelection = new QButtonGroup(this);
mButtonGroupSelection->addButton(ui->rbCell, 0);
mButtonGroupSelection->addButton(ui->rbRow, 1);
connect(ui->rbCell, &QRadioButton::clicked, this, &Widget::onSelectionRadioButtonClicked);
connect(ui->rbRow, &QRadioButton::clicked, this, &Widget::onSelectionRadioButtonClicked);
// 7. 單元格點擊時, 將對應(yīng)行的數(shù)據(jù)顯示到文本框
connect(ui->twStudent, &QTableWidget::itemClicked, this, &Widget::onItemClicked);
}
Widget::~Widget()
{
delete ui;
}
void Widget::appendOneRow(QString name, QString gender, int age, QString province)
{
// 獲取當前行數(shù)
int count = ui->twStudent->rowCount();
qDebug() << "current count:" << count;
// 設(shè)置當前行數(shù)
ui->twStudent->setRowCount(count+1);
QTableWidgetItem* nameItem = new QTableWidgetItem(name);
QTableWidgetItem* genderItem = new QTableWidgetItem(gender);
QTableWidgetItem* ageItem = new QTableWidgetItem(QString::number(age));
QTableWidgetItem* provinceItem = new QTableWidgetItem(province);
nameItem->setTextAlignment(Qt::AlignCenter);
genderItem->setTextAlignment(Qt::AlignCenter);
ageItem->setTextAlignment(Qt::AlignCenter);
provinceItem->setTextAlignment(Qt::AlignCenter);
ui->twStudent->setItem(count, 0, nameItem);
ui->twStudent->setItem(count, 1, genderItem);
ui->twStudent->setItem(count, 2, ageItem);
ui->twStudent->setItem(count, 3, provinceItem);
}
void Widget::insertOneRow(int row, QString name, QString gender, int age, QString province)
{
ui->twStudent->insertRow(row);
// 上面 insertRow 只是插入一個空行,需要手動添加每個單元格的內(nèi)容
QTableWidgetItem* nameItem = new QTableWidgetItem(name);
QTableWidgetItem* genderItem = new QTableWidgetItem(gender);
QTableWidgetItem* ageItem = new QTableWidgetItem(QString::number(age));
QTableWidgetItem* provinceItem = new QTableWidgetItem(province);
nameItem->setTextAlignment(Qt::AlignCenter);
genderItem->setTextAlignment(Qt::AlignCenter);
ageItem->setTextAlignment(Qt::AlignCenter);
provinceItem->setTextAlignment(Qt::AlignCenter);
ui->twStudent->setItem(row, 0, nameItem);
ui->twStudent->setItem(row, 1, genderItem);
ui->twStudent->setItem(row, 2, ageItem);
ui->twStudent->setItem(row, 3, provinceItem);
}
void Widget::on_btnAppend_clicked()
{
QString name = ui->leName->text();
QString gender = ui->leGender->text();
int age = ui->leAge->text().toInt();
QString province = ui->leProvince->text();
appendOneRow(name, gender, age, province);
}
void Widget::on_btnInsert_clicked()
{
QString name = ui->leName->text();
QString gender = ui->leGender->text();
int age = ui->leAge->text().toInt();
QString province = ui->leProvince->text();
// 獲取當前選中的行號
int currentRow = ui->twStudent->currentRow();
insertOneRow(currentRow, name, gender, age, province);
}
void Widget::on_btnDelete_clicked()
{
// 獲取當前選中的行號
int currentRow = ui->twStudent->currentRow();
ui->twStudent->removeRow(currentRow);
}
void Widget::on_btnModify_clicked()
{
QString name = ui->leName->text();
QString gender = ui->leGender->text();
int age = ui->leAge->text().toInt();
QString province = ui->leProvince->text();
// 獲取當前選中的行號
int currentRow = ui->twStudent->currentRow();
QTableWidgetItem* nameItem = new QTableWidgetItem(name);
QTableWidgetItem* genderItem = new QTableWidgetItem(gender);
QTableWidgetItem* ageItem = new QTableWidgetItem(QString::number(age));
QTableWidgetItem* provinceItem = new QTableWidgetItem(province);
nameItem->setTextAlignment(Qt::AlignCenter);
genderItem->setTextAlignment(Qt::AlignCenter);
ageItem->setTextAlignment(Qt::AlignCenter);
provinceItem->setTextAlignment(Qt::AlignCenter);
ui->twStudent->setItem(currentRow, 0, nameItem);
ui->twStudent->setItem(currentRow, 1, genderItem);
ui->twStudent->setItem(currentRow, 2, ageItem);
ui->twStudent->setItem(currentRow, 3, provinceItem);
}
void Widget::onItemClicked(QTableWidgetItem *item)
{
int row = item->row();
QString name = ui->twStudent->item(row, 0)->text();
QString gender = ui->twStudent->item(row, 1)->text();
QString age = ui->twStudent->item(row, 2)->text();
QString province = ui->twStudent->item(row, 3)->text();
ui->leName->setText(name);
ui->leGender->setText(gender);
ui->leAge->setText(age);
ui->leProvince->setText(province);
}
void Widget::on_btnStyleSheet_clicked()
{
QString cellStyle = R"(
QTableView
{
text-align:center;
background-color: rgba(255, 255, 255, 0);
alternate-background-color:#e3edf9;
font:14px "微軟雅黑";
color:#677483;
gridline-color: #ccddf0;
}
)";
const QString horizontalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微軟雅黑";
text-align:center;
height:32px;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
const QString verticalHeaderStyle = R"(
QHeaderView::section {
color: black;
font:bold 14px "微軟雅黑";
width:60px;
text-align:center;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
)";
ui->twStudent->setStyleSheet(cellStyle);
ui->twStudent->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);
ui->twStudent->verticalHeader()->setStyleSheet(verticalHeaderStyle);
}
void Widget::onSelectionRadioButtonClicked()
{
int checkedId = mButtonGroupSelection->checkedId();
if(checkedId == 0) {
ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectItems);
} else if (checkedId == 1) {
ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectRows);
}
}
本節(jié)對應(yīng)的視頻講解:B_站_鏈_接
https://www.bilibili.com/video/BV15N4y177W2文章來源地址http://www.zghlxwxcb.cn/news/detail-530311.html
到了這里,關(guān)于【QT開發(fā)筆記-基礎(chǔ)篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!