找回密码
 立即注册
搜索
查看: 308|回复: 0

QTableWidget 简单表格控件

[复制链接]

266

主题

0

回帖

1119

积分

管理员

积分
1119
发表于 2023-12-19 01:05:11 | 显示全部楼层 |阅读模式

创建表格

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

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

tableWidget = new QTableWidget(12, 3, this);
或
tableWidget = new QTableWidget(this);
tableWidget->setRowCount(10);
tableWidget->setColumnCount(5);

单元格

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

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 等各种控件,扩大表格的适用范围;

测试程序

#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();
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|棱讯科技 ( 粤ICP备2024228160号-2|粤公网安备44030002003510号 )

GMT+8, 2024-7-27 17:23 , Processed in 0.015868 second(s), 3 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表