24. [Python GUI] PyQt5中的模型与视图框架-表格部件QTableWidget

PyQt5的表格部件QTableWidget

QTableWidget 类继承自 QTableView,该类是一个由 Qt 实现的标准的表格部件,该类的数据项由 QTableWidgetItem 类管理。

当前单元格(或当前项目)与当前索引或当前选择是相同的,即可以同时选择多个单元格,但只能有一个当前单元格,当编辑单元格时,只会编辑当前单元格。当前单元格通常具有焦点边框。

单元格和项目的区别(重要概念):
项目是指 QTableWidgetItem 类的对象,因此空单元格是不含有项目的。当在空单元格上单击鼠标时,会发送 cellClicked()信号,但不会发送 itemClicked()信号。 因此当前单元格和当前项目也是有区别的。

一、QTableWidget 类中的属性和函数

1.1 属性和构造函数

  • columnCount: int
    访问函数: int columnCount() const; void setColumnCount(int);

  • rowCount: int
    访问函数: int rowCount() const; void setRowCount(int);
    以上属性描述表格的行数和列数

  • QTableWidget(QWidget *parent = Q_NULLPTR) //构造函数
    QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR)

1.2 设置、移除、获取项目基本信息

  • void setItem(int row, int column, QTableWidgetItem *item)
    把(row, column)处的项目设置为 item,该表格取得 item 的所有权。注意:若启用了排序(按列),则会将行移至由排序确定的位置。

  • QTableWidgetItem * takeItem(int row, int column);
    从表中移除而不删除(row, column)处的项目。

  • QTableWidgetItem *item(int row, int column) const
    返回(row, column)处的项目,否则返回 0。

  • QTableWidgetItem *itemAt(const QPoint &point) const;
    返回位置 point 处的项目。使用内容坐标。

  • QTableWidgetItem *itemAt(int ax, int ay) const
    返回位置(ax, ay)处的项目。使用内容坐标。

  • QRect visualItemRect(const QTableWidgetItem *item) const
    返回项目 item 在视口上所占用的矩形(即位置和大小)。

  • int column(const QTableWidgetItem *item) const
    返回项目 item 所在的列

  • int row(const QTableWidgetItem *item) const
    返回项目 item 所在的行。

  • QList<QTableWidgetItem *> items(const QMimeData *data) const;
    返回包含在 data 中的项目列表。

1.3 当前项目

  • void setCurrentCell(int row, int column)

  • void setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags * command)

  • void setCurrentItem(QTableWidgetItem *item)

  • void setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command)
    以上函数用于设置当前单元格或当前项目,除非选择模式为 NoSelection,否则当前项目会同时被选中。

  • QTableWidgetItem *currentItem() const
    返回当前项目

  • int currentColumn() const
    返回当前项目所在的列。

  • int currentRow() const
    返回当前项目所在的行。

1.4 选择项目

  • QList<QTableWidgetItem *> selectedItems() const
    返回所有被选择项目的列表(不含空单元格)。函数 QTableView::selectedIndexes()包含空单元格。

  • QList selectedRanges() const
    返回所有被选择项目的范围列表(含空单元格)。

  • void setRangeSelected(const QTableWidgetSelectionRange &range, bool select)
    选择或取消选择范围 range 指定的项目。 QTableWidgetSelectionRange 类类似于QItemSelection 用于指示选择的范围。使用方法如下:
    QTableWidgetSelectionRange r(1,1,4,4); //从左上角(1,1)到右下角(4,4)的范围
    setRangeSelected(r, true); //选择 r 指定的范围

1.5 排序、查找、编辑、 模型索引

  • void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)
    使表格按照列 column 进行排序,排序规则(升序或降序)由 order 指定)。

  • void editItem(QTableWidgetItem *item)
    开始编辑项目 item

  • QList<QTableWidgetItem *> findItems(const QString &text, Qt::MatchFlags flags) const
    使用文本 text 查找项目

  • QModelIndex indexFromItem(QTableWidgetItem *item) const;
    返回与 item 关联的模型索引。

  • QTableWidgetItem *itemFromIndex(const QModelIndex &index) const;
    返回与 index 关联的项目

1.6 表头

  • int visualColumn(int logicalColumn) const
    返回逻辑列 logicalColumn 处的可视列(与 QHeaderView 类中的逻辑索引原理相同)。

  • int visualRow(int logicalRow) const;
    返回逻辑行 logicalColumn 处的可视行。

  • QTableWidgetItem *horizontalHeaderItem(int column) const
    void setHorizontalHeaderItem(int column, QTableWidgetItem *item)
    void setHorizontalHeaderLabels(const QStringList &labels)
    QTableWidgetItem *verticalHeaderItem(int row) const
    以上函数用于设置标头,其原理与 QStandardItemView 类中的相应函数相同。

1.7 持久编辑器、 部件、项目原型

  • QWidget *cellWidget(int row, int column) const
    返回单元格(row, column)处的部件

  • void setCellWidget(int row,int column,QWidget *widget);
    把部件设置到位置(row, column)处

  • void removeCellWidget(int row, int column)
    删除单元格(row,column)处的部件。

  • void closePersistentEditor(QTableWidgetItem*item)
    关闭持久编辑器(见 QAbstractItemView)

  • void openPersistentEditor(QTableWidgetItem *item)
    打开持久编辑器

  • bool isPersistentEditorOpen(QTableWidgetItem *item) const
    持久编辑器是否打开。 qt5.10

  • const QTableWidgetItem *itemPrototype() const
    返回该表格的项目原型

  • void setItemPrototype(const QTableWidgetItem *item)
    设置 item 为该表格的项目原型。该表格取得项目原型的所有权。

1.8 槽

  • void clear() //删除视图中的所有项目(包含标头)
  • void clearContents() //删除视图中的数据项(不含标头)
  • void insertColumn(int column) //在 column 处插入一个空列
  • void insertRow(int row) //在 row 处插入一个空行
  • void removeColumn(int column) //移除列 column 及在其上的项目
  • void removeRow(int row) ///移除行 row 及在其上的项目
  • void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)
    滚动视图以使项目 item 可见。 QAbstractItemView::ScrollHint 枚举见相关类

1.9 信号

  • void cellActivated(int row, int column) 激活单元格时发送。
    void itemActivated(QTableWidgetItem *item) //项目被激活时发送。
    windows 下激活是指在单元格上按下回车键, 具体取决于系统。

  • void cellClicked(int row, int column) //单击单元格时发送
    void itemClicked(QTableWidgetItem *item) //单击表格中的项目就发送此信号

  • void cellPressed(int row, int column) //单击单元格时发送
    void itemPressed(QTableWidgetItem *item) //当按下表格中的项目时,发送此信号

  • void cellDoubleClicked(int row, int column) //双击单元格时发送
    void itemDoubleClicked(QTableWidgetItem *item) //双击表格中的项目就发送此信号

  • void cellEntered(int row, int column) //鼠标进入(需开启鼠标跟踪)单元格时发送
    void itemEntered(QTableWidgetItem *item) //当鼠标光标进入项目时(需开启鼠标跟踪)发送

  • void cellChanged(int row, int column) //单元格中的数据发生更改时发送。
    void itemChanged(QTableWidgetItem *item) //当项目的数据项变化时,发送此信号。

  • void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
    当当前单元格发生变化时,发送此信号。

  • void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
    当当前项目发生变化时,发送此信号。

  • void itemSelectionChanged() //当选择改变时,发送此信号

1.10 其他函数(主要用于处理拖放,与 QAbstractItemModel 类中的相应函数类似)

  • virtual bool dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action)
  • virtual QMimeData * mimeData(const QList<QTableWidgetItem *> items) const
  • virtual QStringList mimeTypes() const
  • virtual Qt::DropActions supportedDropActions() const

二、QTableWidgetItem类

QTableWidgetItem 是一个独立的类, 该类用于向 QTableWidget 类提供数据项。

以下函数主要用于设置项目数据,在前面章节已见过,下面以表格的形式列出:
20221128002451

其他的一些函数如下:

  • QTableWidget * tableWidget() const //返回该项目的表格部件
  • int column() const//返回表格中项目所在的列,若项目不在表格中,则返回-1。
  • int row() const //返回表格中项目所在的行,若项目不在表格中,则返回-1。
  • virtual QVariant data(int role) const
    virtual void setData(int role, const QVariant &value)
    把角色 role 的数据设置为 value,该函数可用于添加整型、浮点型等类型的数据。
  • virtual void read(QDataStream &in); //从流中读取项目
  • virtual void write(QDataStream &out) const; //把项目写入流中
  • virtual QTableWidgetItem *clone() const; //创建该项目的副本。
  • int type() const
    返回该数据项的类型,返回的类型主要用于区分是否是自定义类型,返回的值应是枚举
    ItemType 的成员所对应的整数值,见下表:
    20221128002708

三、QTableWidget部件的示例代码

示例代码如下:

from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
import sys

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    
    my_table_widget = QTableWidget(3, 3)    # 构造一个3*3的table
    
    # 创建一些item
    item1 = QTableWidgetItem('AAA')
    
    # 整数值需要使用setData函数添加
    item2 = QTableWidgetItem()
    item2.setData(Qt.ItemDataRole.DisplayRole, 222)
    
    item3 = QTableWidgetItem()
    item3.setIcon(QIcon('C:\\Users\\hubing\\Pictures\\QQ图片20200112144947.jpg'))
    item3.setText('BBB')
    
    item4 = QTableWidgetItem('CCC')
    item5 = QTableWidgetItem('DDD')

    # 将数据项添加到表格里
    my_table_widget.setItem(0, 0, item1)
    my_table_widget.setItem(0, 1, item2)
    my_table_widget.setItem(1, 0, item3)
    my_table_widget.setItem(2, 1, item4)
    my_table_widget.setItem(2, 2, item5)
    
    my_table_widget.show()
    
    sys.exit(app.exec_())

运行效果如图:

20221128005448

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用QTableWidget的setCellWidget()函数来设置一个QLineEdit部件作为单元格的持久编辑器,然后使用双击信号将其激活。具体步骤如下: 1.创建一个QLineEdit部件,并将其设置为单元格的持久编辑器: ```python lineEdit = QLineEdit() tableWidget.setCellWidget(row, column, lineEdit) ``` 2.连接QTableWidget的cellDoubleClicked信号到一个槽函数: ```python tableWidget.cellDoubleClicked.connect(self.editCell) ``` 3.在槽函数获取单元格的坐标,并将其持久编辑器设置为可编辑状态: ```python def editCell(self, row, column): lineEdit = self.tableWidget.cellWidget(row, column) lineEdit.setReadOnly(False) lineEdit.setFocus() ``` 完整代码如下: ```python from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QLineEdit from PyQt5.QtCore import Qt class MyTable(QTableWidget): def __init__(self, rows, columns): super().__init__(rows, columns) self.initUI() def initUI(self): self.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3']) for i in range(self.rowCount()): for j in range(self.columnCount()): item = QTableWidgetItem('Item %d-%d' % (i, j)) self.setItem(i, j, item) # 设置单元格持久编辑器 for i in range(self.rowCount()): for j in range(self.columnCount()): lineEdit = QLineEdit() lineEdit.setReadOnly(True) self.setCellWidget(i, j, lineEdit) # 连接双击信号到槽函数 self.cellDoubleClicked.connect(self.editCell) def editCell(self, row, column): lineEdit = self.cellWidget(row, column) lineEdit.setReadOnly(False) lineEdit.setFocus() if __name__ == '__main__': app = QApplication([]) table = MyTable(4, 3) table.show() app.exec_() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_cat

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值