阡陌 发表于 2023-12-19 01:05:11

QTableWidget 简单表格控件



!(https://file.mculoop.com/images/2022/11/2015-12-26_164722_1668589785.jpg )

## 创建表格
QTableWidget 是基于数据项(Item-based)的表格视图类。它提供了一种标准的表格数据显示模型(QTableWidgetItem),如果要自定义一种非标准的模型就要考虑使用 QTableView 了。

可以灵活地选择在构造表格的时候指定行数和列数,或者在构造以后再动态地调整他们。

<!--more-->

```cpp
tableWidget = new QTableWidget(12, 3, this);

tableWidget = new QTableWidget(this);
tableWidget->setRowCount(10);
tableWidget->setColumnCount(5);
```



## 单元格
QTableWidgetItem 是用于 QTableWidget 表格单元格的数据项类,它包含了文本、图标和复选框这几个常用的信息。向表格中加入的数据内容是以单元格的形式加入的,单元格是在表格的外部创建而后加入到指定单元格位置的。

```cpp
QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg( (row+1)*(column+1)));
tableWidget->setItem(row, column, newItem);
```



## 表头
使用 `void QTableWidget::setHorizontalHeaderLabels(const QStringList & labels)` 和 `void QTableWidget::setVerticalHeaderLabels(const QStringList & labels)` 可以便捷地给表格增加水平和垂直表头。由于表头可以看作是特殊的单元格,同样也可以像创建普通单元格那样先创建好再使用 `void QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem * item)` 或 `void QTableWidget::setVerticalHeaderItem(int row, QTableWidgetItem * item)` 方法关联到表格。




## 其他一些常用的方法
`void QTableWidget::clear()` 清除所有包括表头在内的所有单元格(只清空内容item);
`void QTableWidget::clearContents()` 清除表头之外的单元格(只清空内容item);
`QList<QTableWidgetItem *> QTableWidget::findItems(const QString & text, Qt::MatchFlags flags) const` 查找单元格;
`void QTableWidget::insertColumn(int column)` 向表格中插入一个空列;
`void QTableWidget::insertRow(int row)` 向表格中插入一个空行;
`QTableWidgetItem * QTableWidget::item(int row, int column) const` 返回一个单元格数据项的指针,如果单元格没有设置数据项则返回 0;
`void QTableWidget::removeColumn(int column)` 移除指定列以及该列中的所有数据项;
`void QTableWidget::removeRow(int row)` 移除指定行以及该行中的所有数据项;
`void QTableWidget::setCellWidget(int row, int column, QWidget * widget)` 将一个指定的 QWidget 控件托管给表格,并显示在指定的单元格处。可以用向表格加入进度条、QLabel 等各种控件,扩大表格的适用范围;



## 测试程序

```cpp
#include <QApplication>
#include <QTableWidget>
#include <QDebug>
#include <QHeaderView>
#include <QScrollBar>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationName("查户口...");
    QTableWidget w(0, 5); // 创建 0 行 5 列的表

    //表头相关
    QStringList tabTitle;
    tabTitle << "姓名" << "性别" << "年龄" << "居住地" << "Blah Blah Blah";
    w.setHorizontalHeaderLabels(tabTitle); //设置水平表头文字
    QFont font("Microsoft YaHei UI", 12, QFont::Bold);
    w.horizontalHeader()->setFont(font); //设置表头字体
    w.horizontalHeader()->setDefaultSectionSize(100); //设置默认列宽
    w.horizontalHeader()->resizeSection(4, 200); //设置表头第 5 列的宽度为200
    //w.horizontalHeader()->setStretchLastSection(true); //设置充满表宽度
    //w.verticalHeader()->setDefaultSectionSize(12); //设置默认行高
    w.verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); //设置为根据内容自动调整行高
    //w.verticalHeader()->setVisible(false); //设置垂直表头不可见,默认是显示行号


    //单元格
    //w.setShowGrid(false); //设置不显示格子线
    //w.setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑

    //选择相关
    //w.setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次选择一行
    w.setSelectionMode(QAbstractItemView::SingleSelection); //设置为不可选择


    //样式定义
    w.horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:15px;}"
                                           "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;}");

    w.verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 15px;}"
                                           "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;}");

    w.horizontalHeader()->setStyleSheet("QHeaderView::section{\
                            background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,\
                            stop:0 #616161, stop: 0.5 #505050,\
                            stop: 0.6 #434343, stop:1 #656565);\
                            color: white;\
                            padding-left: 4px;\
                            border: 1px solid #6c6c6c;}\
                            QHeaderView::section:checked{background-color: red;}\
                            /* style the sort indicator */\
                            QHeaderView::down-arrow {image: url(down_arrow.png);}\
                            QHeaderView::up-arrow {image: url(up_arrow.png);}"); //设置水平表头背景色
    w.verticalHeader()->setStyleSheet("QHeaderView::section{background:#000;color:#fff;}"); //设置垂直表头背景色

    w.setStyleSheet("selection-background-color:#B8DE6A;"); //设置选中背景色


    //向表格写入数据
    w.insertRow(0);
    w.setItem(0, 0, new QTableWidgetItem("霄霄"));
    w.setItem(0, 1, new QTableWidgetItem("女"));
    w.setItem(0, 2, new QTableWidgetItem("123"));
    w.setItem(0, 3, new QTableWidgetItem("天姥山"));
    w.setItem(0, 4, new QTableWidgetItem("-_-|"));

    w.insertRow(1);
    w.setItem(1, 0, new QTableWidgetItem("风清扬"));
    w.setItem(1, 1, new QTableWidgetItem("不详"));
    w.setItem(1, 2, new QTableWidgetItem("250"));
    w.setItem(1, 3, new QTableWidgetItem("峨眉山"));
    w.setItem(1, 4, new QTableWidgetItem("-_-||| ~"));

    w.insertRow(2);
    w.insertRow(2);
    w.insertRow(2);
    w.insertRow(2);
    w.insertRow(2);
    w.insertRow(2);

    w.show();

    //w.clearContents();

    return a.exec();
}
```


页: [1]
查看完整版本: QTableWidget 简单表格控件