Qt:QTableWidget

0、说明

QTableWidget类提供了一个基于Item的Table视图,如下图:

Qt:QTableWidget

Table Widget提供了表格用于显示。Table中的每个Item都是QTableWidgetItem对象。

如果我们想要一个存储我们自己的model的Table,应该用QTableView而不是这个类。

Table Widget构造时,传入Table的行数和列数作为参数:

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

不过,也可以先构造一个空Table Widget,之后再为它设置行列数:

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

Item在Table外构造(没有parent widget),之后通过setItem()把它插入到Table中。

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

如果我们想实现排序功能,需要在填充item之后进行,否则会被插入顺序所干扰(可以看setItem()来获取详细信息)。

Table可以设置索引行和索引列。最简单的构造方法是,通过setHorizontalHeaderLabels()和setVerticalHeaderLabels(),传入的参数是索引StringList,List中每一项都是一个索引。更成熟的方法是从已存在的Table Item构造索引Header。例如,我们可以用一个icon和一串文本(aligned text)构造一个特殊索引列。

    QTableWidgetItem *cubesHeaderItem = new QTableWidgetItem(tr("Cubes"));
    cubesHeaderItem->setIcon(QIcon(QPixmap(":/Images/cubed.png")));
    cubesHeaderItem->setTextAlignment(Qt::AlignVCenter);

Table中的行数可以通过rowCount()得知,列数可以通过columnCount()得知。通过clear()来清空Table。

 

1、模块和加载项

Header: #include <QTableWidget>
qmake: QT += widgets
Inherits: QTableView
 

2、构造

QTableWidget(int rows, int columns, QWidget *parent = nullptr) 构造一个指定行列数的空Table
QTableWidget(QWidget *parent = nullptr) 构造一个空Table

 

4、成员字段

int columnCount 列数
int rowCount 行数

 

6、成员方法

返回值类型

方法

说明

 QWidget * cellWidget(int row, int column) 返回一个QWidget展示给定行列的cell
 void closePersistentEditor(QTableWidgetItem *item) 关闭当前Item编辑器
 int column(const QTableWidgetItem *item) 返回参数Item的所在列
 int columnCount() 一共多少列
 int currentColumn() 当前Item所在列
 QTableWidgetItem * currentItem() 当前Item
 int currentRow() 当前Item所在行
 void editItem(QTableWidgetItem *item) 如果Item是可编辑的,那么开始编辑该Item
 QList<QTableWidgetItem *> findItems(QString text, Qt::MatchFlags flags) 查找Item
 QTableWidgetItem * horizontalHeaderItem(int column) 返回某一列的行Header Item
 bool isPersistentEditorOpen(QTableWidgetItem *item) Item编辑器是否开启
 QTableWidgetItem * item(int row, int column) 提取指向指定行、列的Item的指针
 QTableWidgetItem *

itemAt(QPoint point)

itemAt(int ax, int ay)

提取Widget坐标系中指定坐标的Item的指针
 QTableWidgetItem * itemPrototype()  
 void openPersistentEditor(QTableWidgetItem *item) 为给定Item打开编辑器,编辑器在完成编辑后会一直开启
 void removeCellWidget(int row, int column) 移除指定行列cell的Widget
 int row(const QTableWidgetItem *item) 返回Item的Row
 int rowCount() 行数
 QList<QTableWidgetItem *> selectedItems() 返回一个List *,其中有所有选中的Items
 QList<QTableWidgetSelectionRange> selectedRanges()  
void setCellWidget(int row, int column, QWidget *widget)

在指定Cell处展示Widget,如果先后在同一个Cell设置了不同的Widget,那么后一个Widget会覆盖前一个

setCellWidget(row, column, new QLineEdit);
...
setCellWidget(row, column, new QTextEdit);
setColumnCount(int columns) 重定义列数,如果小于当前列数,则会丢弃多余列
setCurrentCell(int row, int column) 设置当前Cell为指定的Cell
setCurrentItem(QTableWidgetItem *item) 设置当前Item为指定的Item
setHorizontalHeaderItem(int column, QTableWidgetItem *item) 设置column列的索引Item为item
setHorizontalHeaderLabels(QStringList labels) 设置索引行标签
setItem(int row, int column, QTableWidgetItem *item) 设置指定行列的Item为item
setItemPrototype(const QTableWidgetItem *item)  
setRangeSelected(QTableWidgetSelectionRange range, bool select)  
setRowCount(int rows) 重定义行数,多出的行会被丢弃
setVerticalHeaderItem(int row, QTableWidgetItem *item) 设置row行的索引Item为item
setVerticalHeaderLabels(QStringList labels) 设置索引列标签
sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder) 对Table所有行按column列和order规则进行排序
 QTableWidgetItem * takeHorizontalHeaderItem(int column) 提取指定column的索引行的Item
 QTableWidgetItem * takeItem(int row, int column) 提取指定行、列的Item
 QTableWidgetItem * takeVerticalHeaderItem(int row) 提取指定row的索引列的Item
 QTableWidgetItem * verticalHeaderItem(int row) 提取指定row的索引列的Item
int  visualColumn(int logicalColumn) 返回给定logicalColumn的可视列
 QRect visualItemRect(const QTableWidgetItem *item) 返回只有指定Item的矩形视图
 int visualRow(int logicalRow) 返回给定logicalRow的可视行

 

7、信号

信号

说明

cellActivated(int row, int column) 当指定行列的cell被激活时发送该信号
cellChanged(int row, int column) 当指定行列的cell中的数据被激活时发送该信号
cellClicked(int row, int column) 每当Table中的一个cell被点击时发送该信号,信号中的参数是被点击的cell的行、列
cellDoubleClicked(int row, int column) 每当Table中的一个cell被双击时发送该信号,信号中的参数是被双击的cell的行、列
cellEntered(int row, int column) 每当鼠标光标进入一个cell时发送该信号,信号中的参数是cell的行、列
cellPressed(int row, int column) 每当Table中的一个cell被按时,信号中的参数是被按的cell的行、列(可能是键盘?该信号不确定)
currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) 每当Table中的当前聚焦的cell改变时,参数分别标明改变前后的cell的行、列
currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) 每当Table中的当前的Item改变时,参数分别标明改变前后的Item
itemActivated(QTableWidgetItem *item) 每当Table中参数指明的Item激活(选中)时,发送该信号
itemChanged(QTableWidgetItem *item) 每当Table中参数指明的Item改变时,发送该信号
itemClicked(QTableWidgetItem *item) 每当Table中参数指明的Item被单击时,发送该信号
itemDoubleClicked(QTableWidgetItem *item) 每当Table中参数指明的Item被双击时,发送该信号
itemEntered(QTableWidgetItem *item) 每当鼠标焦点进入Table中的某个Item时,发送该信号,参数指明这个Item
itemPressed(QTableWidgetItem *item) 每当Table中的某个Item被按时,发送该信号,参数指明这个Item
itemSelectionChanged() 每当选中的Item改变时发送该信号

 

8、槽

说明

clear() 移除Table中的所有Item,包括索引
clearContents() 移除Table中的所有Item,不包括索引。
insertColumn(int column) 在column列插入一个空列
insertRow(int row) 在row行插入一个空行
removeColumn(int column) 移除column列
removeRow(int row) 移除row行
scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) 上下滚动视图,以保证item始终可见
上一篇:Qtablewidget的排序问题


下一篇:QTableWidget如何设置只能选中一行?