[QT_010]Qt学习之QTableWidgetItem详解
本文转自:《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() 遮挡)。
更多推荐
所有评论(0)