QTableWidget的一些常用方法

下面两个类可以根据自己的情况自定义。

单元格类型的类:

class CellType(Enum):
ctKey = 1000
ctPath = 1001
ctInfo = 1002

单元格列的类:

class FieldColNum(Enum):
colKey = 0
colPath = 1
colInfo = 2

一、设置TableWidget的表头

headerItem = QTableWidgetItem("要写入单元格里的内容")
self.ui.tableWidget.setHorizontalHeaderItem(列数序号, headerItem)

二、设置TableWidget行数

self.ui.tableWidget.setRowCount(行数)

三、设置TableWidget单元格内容

item = QTableWidgetItem("单元格内容", 单元格类型) # CellType.ctKey.value
self.ui.tableWidget.setItem(行序号, 列序号, item)

四、插入、添加、删除

curRow = self.ui.tableWidget.currentRow()  # 当前行号
self.ui.tableWidget.insertRow(curRow) # 插入行 curRow = self.ui.tableWidget.rowCount()
self.ui.tableWidget.insertRow(curRow) # 添加行 curRow = self.ui.tableWidget.currentRow() # 当前行号
self.ui.tableWidget.removeRow(curRow) # 删除行

五、自动调整行高、自动调整列宽

self.ui.tableWidget.resizeRowsToContents()  # 自动调整行高
self.ui.tableWidget.resizeColumnsToContents() # 自动调整列宽

六、是否可编辑

self.ui.tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked)  # 可编辑
self.ui.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 不可编辑

七、是否显示行表头,是否显示列表头。True代表是,False代表不显示

self.ui.tableWidget.horizontalHeader().setVisible(True)  # 显示行表头
self.ui.tableWidget.verticalHeader().setVisible(True) # 显示列表头

八、行选择、单元格选择

self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)  # 行选择
self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems) # 单元格选择

九、清空表格内容

self.ui.tableWidget.clearContents()

十、读取单元格内容

item = self.ui.tableWidget.item(行序号, 列序号)
content = item.text() # 获取单元格内容
status = item.checkState() # 获取单元格状态,Qt.Checked或者Qt.Unchecked

十一、间隔行变色

self.ui.tableWidget.setAlternatingRowColors(True)  # 变色
self.ui.tableWidget.setStyleSheet("alternate-background-color: rgb(197, 197, 197);")

十二、设置列宽。参考链接:https://blog.csdn.net/baidu_37503452/article/details/104225719

self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.ui.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Interactive)

十三、在一个单元格中插入一个button

            btn_path_select = QPushButton("...")
self.ui.tableWidget.setCellWidget(j, 1, btn_path_select)

效果图:

十四、在一个单元格中插入两个控件

            label_path_select = QLabel(“\路径\test.py”)
btn_path_select = QPushButton("...")
btn_path_select.setMaximumWidth(40)
cell_widget = QWidget()
box_layout = QHBoxLayout(cell_widget)
box_layout.addWidget(label_path_select)
box_layout.addWidget(btn_path_select)
box_layout.setContentsMargins(0, 0, 0, 0)
self.ui.tableWidget.setCellWidget(j, 1, cell_widget)

效果图:

十五、设置单元格中button按钮的单击事件

    def do_btn_path_select_clicked(self):
sender_obj = self.sender()
cell_widget = sender_obj.parent()
# print(cell_widget.children()[1])
        cell_idx = self.ui.tableWidget.indexAt(QPoint(cell_widget.frameGeometry().x(), cell_widget.frameGeometry().y()))
cell_row = cell_idx.row()
cell_column = cell_idx.column()
     # 单元格的行和列
print(cell_row, cell_column)
        if sender_obj is None:
pass
else:
idx = self.ui.tableWidget.indexAt(QPoint(sender_obj.frameGeometry().x(), sender_obj.frameGeometry().y()))
       # button的行和列
row = idx.row()
column = idx.column()
if column == 1:
filename, flt = QFileDialog.getOpenFileName(self, "选择一个或多个文件", "", "All Files (*);;Text Files (*.txt)")
cell_widget.children()[1].setText(filename)

效果图:

十六、设置QTableWidget的单击事件

    def do_table_widget_clicked(self, index):
table_column = index.column()
table_row = index.row()
# current_item = self.ui.tableWidget.item(table_row, table_column)
current_widget = self.ui.tableWidget.cellWidget(table_row, table_column)
path_label_obj = current_widget.children()[1]
path_button_obj = current_widget.children()[2]
# print(path_label_obj.text())
path_label_obj.setText("已单击此单元格")

效果图:

十七、单击单元格cellWidget事件

    def do_table_widget_cell_clicked(self, row, column):
current_widget = self.ui.tableWidget.cellWidget(row, column)
path_label_obj = current_widget.children()[1]
path_label_obj.setText("已单击此单元格")

效果图同十六是一样的。

关于TableWidget的一些基本设置说完了以后,下面就了解一下可能值得注意的点。

首先,关于splitter的比例问题。在右侧,QTableWidget和QPlainTextEdit两个组件刚布局为splitter时,两个的比例是1:1,如果想要按照自己的比例调整大小,怎么办呢。

先选中QTableWidget,在其属性那里找到Vertical Stretch属性,这里设置为6,同样,选中QPlainTextEdit,在其属性里找到那个属性,设置为4。那么这两个控件高度的比例就为6:4了。

第二个就是关于那个隔行变色的功能了,原始的是白色和灰色,效果并不明显,所以我自己修改了颜色,对比度更大一点。

找到styleSheet属性,点击右边的那三个点。

选择Add Color --》alternate-background-color,然后选择一个自己喜欢的颜色就好了。

第十九篇 -- QTableWidget的使用的更多相关文章

  1. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  2. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  3. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  4. Python开发【第十九篇】:Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  5. 【Python之路】第十九篇--Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  6. SpringBoot非官方教程 | 第十九篇: 验证表单信息

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot19/ 本文出自方志朋的博客 这篇文篇主要简述如何 ...

  7. 第十九篇 .NET高级技术之C#中的线程(一)

    原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...

  8. spring-第十九篇AOP面向切面编程之增强处理的优先级

    1.从我们第十七篇举例了不同类型的增强处理. spring AOP采用和AspectJ一样的优先顺序来织入增强处理:在“进入”连接点时,具有最高优先级的增强处理将先被织入(在给定的两个Before增强 ...

  9. 第九十九篇:JS闭包

    好家伙,总是要来的,去面对那些晦涩难懂的原理,它就在那里,等着我去搞定它 首先我要去补充一些最基本的概念, 1.什么是内存? 新华字典永远的神, 但这个解释显然不够   去看看百度百科: 内存: CP ...

随机推荐

  1. Kubernetes 实战——升级应用(Deployment)

    一.更新运行在 Pod 内的应用程序 1. 修改 Pod 模板 将导致应用程序在一定时间内不可用 2. 修改 Service 的 Pod 选择器 需要同时运行两倍的 Pod 3. 滚动升级 应用程序需 ...

  2. 11张流程图搞定 Spring Bean 生命周期

    在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...

  3. 关于web移动端定位

    最近在做一个搜索附近3公里所有超市信息(已经录入数据库的超市信息)的功能.思路很简单只是获取用户当前地理位置(经纬度),通过sql语句筛选出3公里范围内的所有超市信息,然后传递到前台页面展示出来.但是 ...

  4. csps前小结

    冒着题没改完颓废被发现的风险来写博客 好像离csps只剩两天了,然而没啥感觉 最近考试有时考得还算可以,有时也会很炸 今天考试事实上心态啥崩,因为T1结论题一直没思路,想了一个小时连暴力都没打 过了一 ...

  5. 【模拟8.09】轰炸行动(bomb) (tarjan缩点和拓扑排序)

    很显然的tarjan嘛......拓扑也很容易想到 我是不会说我因为懒把拓扑改成DFS结果扔了40分然后就是纯板子了 因为我们一条路径的点如果不是一个一个炸,同时炸两个,他们一定会相互到达.... 找 ...

  6. 【题解】codeforces 219D Choosing Capital for Treeland 树型dp

    题目描述 Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市.每条道路只能单向通行.现在政府需要决定选择哪个城市为首都.假如城市i成为了首都,那么为了使首都能到达任意一 ...

  7. redis不完整的事务实现Transaction

    使用场景 redis一个命令执行是单线程的,不用担心并发冲突,如果你想有几个命令想像一个命令一样,在这几个命令执行过程中不会执行别的客户端发来的命令 ,也就是原子性,就可以用 redis Transa ...

  8. Java知识复习(三)

    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象.还是都不用. 在比较时先调用hashCode方法, ...

  9. error C3646: 未知重写说明符

    记录一个报错 error C3646: 未知重写说明符 ①循环引用 在项目文件变多时,由于组织不当,很容易出现头文件的循环引用 有时候虽然没有出现循环引用,但是头文件多处被include :适当的使用 ...

  10. webpack(1)安装环境与解决环境问题

    前言 如果我们需要使用webpack,就需要依赖node环境 nvm node npm webpack@cli webpack nvm安装 nvm是一个用来管理node版本的工具.我们之所以需要使用n ...