第十九篇 -- QTableWidget的使用
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的使用的更多相关文章
- Python之路【第十九篇】:爬虫
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)
第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- Python开发【第十九篇】:Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- 【Python之路】第十九篇--Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- SpringBoot非官方教程 | 第十九篇: 验证表单信息
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot19/ 本文出自方志朋的博客 这篇文篇主要简述如何 ...
- 第十九篇 .NET高级技术之C#中的线程(一)
原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...
- spring-第十九篇AOP面向切面编程之增强处理的优先级
1.从我们第十七篇举例了不同类型的增强处理. spring AOP采用和AspectJ一样的优先顺序来织入增强处理:在“进入”连接点时,具有最高优先级的增强处理将先被织入(在给定的两个Before增强 ...
- 第九十九篇:JS闭包
好家伙,总是要来的,去面对那些晦涩难懂的原理,它就在那里,等着我去搞定它 首先我要去补充一些最基本的概念, 1.什么是内存? 新华字典永远的神, 但这个解释显然不够 去看看百度百科: 内存: CP ...
随机推荐
- Java Spring boot 多商户入驻 外卖|跑腿|代驾 Uniapp版本
技术说明: 源码下载:https://www.yuanmahy.com/8357.html 开发环境:jdk1.8,mysql5.7,node 9.4,redis6.2,npm6.9 开发工具:前端使 ...
- 【NX二次开发】NX内部函数,libuifw.dll文件中的内部函数
本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: void U ...
- Django基础之cookie与session
cookie与session 由来及简介 HTTP协议四大特性 1.基于请求响应 2.基于TCP.IP作用于应用层之上 3.无连接 4.无状态 基于HTTP协议的通信无法记录客户端状态 但是现在很多软 ...
- 小目标增强(Augmentation for small object)
小物体检测的增强 摘要:在近些年来,目标检测已经有了长足的进步.尽管有很大改进,但是在小目标和大目标检测性能方面还是有巨大的差距.我们在具有挑战性的数据集MS-COCO上分析了目前性能最好的模型Mas ...
- spring boot使用@Async异步注解
1.java的大部分接口的方法都是串行执行的,但是有些业务场景是不需要同步返回结果的,可以把结果直接返回,具体业务异步执行,也有些业务接口是需要并行获取数据,最后把数据聚合在统一返回给前端. 通常我们 ...
- 撸了几天的sofa-tracer之后,我悟了!
什么是分布式链路跟踪 简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术. 应用场景如下: 应用A,B,C,D,E 以一个层级关系依赖, 当用户向 应用A 发起请求,但是返回了个异常,为了排查这 ...
- 《MySQL面试小抄》索引考点二面总结
<MySQL面试小抄>索引考点二面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...
- 自定义Nuget包的技巧一二
背景: 在项目中, 通常会拆分成核心库(Core)和应用(App)两个部分.核心库由专人维护, 不同的App是不同的团队,但都引用了核心库.当核心库需要升级更新时,有的应用会更新,有的不会--可能是没 ...
- Golang通过结构体解析和封装XML
Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...
- SpringCloud 微服务最佳开发实践
Maven规范 所有项目必须要有一个统一的parent模块 所有微服务工程都依赖这个parent,parent用于管理依赖版本,maven仓库,jar版本的统一升级维护 在parent下层可以有 co ...