本文转自:《Qt编程指南》        作者:奇先生

Qt编程指南,Qt新手教程,Qt Programming Guide

8.2.2 QTableWidgetItem


表格控件条目 QTableWidgetItem 与 8.1.2 节 QListWidgetItem 有很多相似的地方,
QTableWidgetItem 也是一个纯数据类,不是控件,没有基类,也就没有信号和槽函数。QTableWidgetItem 可以直接用数据流 QDataStream 读写,表格条目不单单有文本,还可以有自己的图标、复选框等特性,表格控件会根据条目对象的丰富特性来呈现数据并进行交互操作。


(1)首先来看看条目的构造函数:

    QTableWidgetItem(int type = Type)

    QTableWidgetItem(const QString & text, int type = Type)

    QTableWidgetItem(const QIcon & icon, const QString & text, int type = Type)

    QTableWidgetItem(const QTableWidgetItem & other) //复制构造函数

参数里的 type 一般用于派生类,指定条目独特的分类,对于普通的表格控件条目,通常用默认的数值即可。第二个构造函数是指定了条目的文本,第三个构造函数同 时指定了条目图标和文本。
在构造函数里不能直接指定所属的表格控件,因为表格控件有行号、列号所以不能简单追加到表格里,而只能用表格控件的 QTableWidget::​setItem() 函数把条目设置到指定单元格里。注意一个条目只能设置给表格控件唯一的一个单元格,不能把一个条目设置给多个单元格。如果希望为多个单元格设置相似的条目数据内容,那么可 以用后面介绍的 clone() 函数制造大量新的复制体条目。
复制构造函数不会复制旧条目的 type() 类型值和tableWidget() 所属表格控件指针,条目其他的内部数据和条目标志都会复制。


(2)复制函数和运算符函数


除了复制构造函数,还有专门的克隆函数:

QTableWidgetItem * QTableWidgetItem::​clone() const

克隆函数会新建一个当前条目的复制体,然后返回新复制体条目的指针,如果要构造并添加大量重复内容的条目,这个函数就比较实用。clone() 函数内部会调用复制构造函数创建新条目并返回。
条目复制还可以用等于号函数:

QTableWidgetItem & QTableWidgetItem::​operator=(const QTableWidgetItem & other)

等于号函数复制的内容与复制构造函数差不多,type() 类型值和 tableWidget() 所属表格控件指针也不复制。
还有个小于号函数,可以比较条目文本的字典序:

QTableWidgetItem & QTableWidgetItem::​operator=(const QTableWidgetItem & other)

如果希望使用更多的比较函数,可以直接用 QString 的比较函数。


(3)QTableWidgetItem 的功能函数与内部数据


QTableWidgetItem 内部的数据也大致分为两类:第一类是以数据角色形式管理的通用数据,这些数据自动参与 QDataStream 数据流的读写;第二类是非通用数据,不参与数据流读写,与 QListWidgetItem 和 QListWidget 自身特性有关。QTableWidgetItem 主要的功能函数也是围绕这两类内部数据展开的。

第一类:通用数据及其处理函数
通用数据是以数据角色与数据变量一一对应的形式存储管理,比如设置文本 setText()、设置图标 setIcon() 等函数,其本质都是根据各自的角色调用通用设置数据的函数:

virtual void setData(int role, const QVariant & value)

也可以根据角色来获取各个数据变量:

virtual QVariant data(int role) const

查看表格控件的源代码文件可以看到关于图标操作函数的源码:

inline QIcon icon() const
   { return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }

inline void QTableWidgetItem::setIcon(const QIcon &aicon)
   { setData(Qt::DecorationRole, aicon); }

QTableWidgetItem 的通用数据与 QListWidgetItem 的通用数据一模一样,函数名也一样,列表如下:

获取函数设置函数数据角色描述
text()setText(const QString &text)Qt::DisplayRole条目显示的文本。
icon()setIcon(const QIcon &icon)Qt::DecorationRole条目显示的图标。
statusTip()setStatusTip(const QString &statusTip)Qt::StatusTipRole如果主界面有状态栏,鼠标悬停在该条目上时显示该状态信息到状态栏。
toolTip()setToolTip(const QString &toolTip)Qt::ToolTipRole鼠标悬停在该条目上时显示的工具提示信息。
whatsThis()setWhatsThis(const QString &whatsThis)Qt::WhatsThisRole如果主界面窗口标题栏有?帮助按钮,点击帮助按钮再点击该条目会显示该帮助信息。
font()setFont(const QFont &font)Qt::FontRole显示条目文本用的字体。
textAlignment()setTextAlignment(int alignment)Qt::TextAlignmentRole文本的对齐方式。
backgroundColor()setBackgroundColor(const QColor &color)Qt::BackgroundColorRole文本背景色。
textColor()setTextColor(const QColor &color)Qt::TextColorRole文字颜色。
background()setBackground(const QBrush &brush)Qt::BackgroundRole条目的背景画刷。
foreground()setForeground(const QBrush &brush)Qt::ForegroundRole条目的前景画刷。
checkState()setCheckState(Qt::CheckState state)Qt::CheckStateRole条目自带的复选框选中状态,可以是三态复选框。
sizeHint()setSizeHint(const QSize &size)Qt::SizeHintRole条目显示的建议尺寸。


表格条目 QTableWidgetItem 可以直接用数据流 QDataStream 读写,是通过下面运算符重载函数实现的:

QDataStream &    operator<<(QDataStream & out, const QTableWidgetItem & item)

QDataStream &    operator>>(QDataStream & in, QTableWidgetItem & item)

使用 >> 和 << 运算符进行流输入输出比较常见,当然也可以用 QTableWidgetItem 类内部的读写函数进行输入输出:

void QTableWidgetItem::​read(QDataStream & in)

void QTableWidgetItem::​write(QDataStream & out) const


第二类:非通用数据及其操作函数
表格控件的条目也是在构造函数一次性指定条目类型,然后这个类型是只读的:

int QTableWidgetItem::​type() const

类型值一般用于派生类区分不同的条目类型,自定义的条目类型值需要大于等于 QTableWidgetItem::UserType 。
新条目通过表格控件 QTableWidget::​setItem() 函数设置给表格控件之后,条目会自动保存所属的表格控件指针,可以用如下函数获取:

QTableWidget * QTableWidgetItem::​tableWidget() const


程序运行时,除了可以通过表格控件的 QTableWidget::​selectedItems() 获取用户选中的条目列表,每个单元格条目自身也会记录是否 被用户选中,并且能设置自身是否被选中:

bool QTableWidgetItem::​isSelected() const //判断条目自身是否高亮选中

void QTableWidgetItem::​setSelected(bool select) //设置条目自身是 否被选中


表格控件条目初始化时也有默认的标志位,并且运行时可以修改条目的特性标志:

Qt::ItemFlags QTableWidgetItem::​flags() const //获取特性标志位

void QTableWidgetItem::​setFlags(Qt::ItemFlags flags) //设置特性标志位

QTableWidgetItem 构造时默认的标志位为

    Qt::ItemIsEditable
    |Qt::ItemIsSelectable
    |Qt::ItemIsUserCheckable
    |Qt::ItemIsEnabled
    |Qt::ItemIsDragEnabled
    |Qt::ItemIsDropEnabled


因此程序代码生成的所有表格条目默认都是可编辑的,程序运行时用户双击空的单元格时,表格控件会自动创建新条目保存用户编辑内容,这些自动创建的条目也都是可编辑的如果希望条目是只读的,那么把标志位设置不带Qt::ItemIsEditable 的新标志位即可。

Qt::ItemFlags 所有的枚举常量在 8.1.2 节末尾有详细的表格描述,这里不重复贴了。表格条目默认就是支持复选状态的,只是默认没有显示出来,要让表格控件显示条目对应的复选框,可以用下面一句代码实现:

 item->setCheckState( Qt::Unchecked );  //显示复选框

对于表格控件和表格条目,自带单行编辑器和复选框功能,因此不需要为单元格添加自定义的单行编辑器或复选框,如果要用到其他更多的输入控件,那才需要定制单元格。
表格控件条目与 QListWidgetItem 最大的一个区别就是表格条目既有行号,也有列号:

int QTableWidgetItem::​row() const //获取行号

int QTableWidgetItem::​column() const //获取列号

行号和列号也是在 QTableWidget::​setItem() 函数里指定的,条目自身并不能修改行号或列号。表格控件条目与 QListWidgetItem 另一个区别是,表格控件条目没有隐藏函数,所有表格条目都是显示的(只要不被单元格控件QTableWidget::​cellWidget() 遮挡)。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐