本帖最后由 jumpbull 于 2025-1-14 22:49 编辑
软件编写花絮
这是学习 pyqt 的第二个软件,虽然现在也还在学习,但边学边用最有效果!
pyqt 比 tkinter 好用太多了,但也存在不少坑,学习使用时还是得一个个去填,比如 QTableWidget 就不提供移动功能,还得自己写方法,这还是小事,最要命的是它的 item 对象还是一次性的,只要用过就失效,还得把它克隆后才能再使用。这个坑卡了我差不多一天!
QTreeWidget 也一样,移动功能还得自己写,这些小部件在写修改方法时,若绑定了修改信号,还会在移动时乱发信号,这里也我把坑了一把,最后靠暂时信号后才正常,所以几乎每个修改方法前后都要加屏蔽信号、恢复信号的代码。
在自己编写 QTableWidget 行移动时非常烧脑,还要考虑多选问题,向上移、向下移、移到选择中间,甚至还有移到最前面、最后面的处理方法都不一样,我又不是数学学霸。不能快速特定算法,只能通过不断的试验、中断找方法,确实好累!!!
pyqt 中菜单图标尺寸没找到方法实现,只能按 16*16尺寸显示,在网上转了半天,才找到一篇说自定义菜单的文章,也就是使用 QWidgetAction来加载 自定义的 QWidget 菜单项,最后终于能实现菜单图标尺寸按自己的想法来显示。但最后卡在二级菜单上,二级菜单目前还是找不到方法显示其他尺寸图标的方法。
pyqt 的代码要比 tkinter 多太多,但提供的功能确实强大,这工具以前就有的想法无法用 tkinter 实现,现用 pyqt 就能轻松解决,比如原修复歌单原来只能在 text 对象上添加按键实现,但位置非常不好控。现在改用 pyqt ,QTableWidget 、QTreeWidget 都能很方便地在任何位置添加,且它们还支持添加用户数据,就是暂存一些与显示相关的数据,在处理 item 时能很方便的获取,原来只能存在变量中,处理起来会很烧脑。
这里还在使用 tkinter 的,我强烈建议转型使用 pyqt ,优点远远大于缺点!
目前软件还有两个小问题没找到解决方法,如果哪位大能有解决方案,希望能给予赐教!!
1、二级菜单项图标尺寸控制问题
2、正常读取 UTF-8 编码磁盘卷标的方法
这里给大家示例一下 QTableWidget 多行移动的模型,有兴趣的可以看看,让大家了解一下编程的大体思路
[Python] 纯文本查看 复制代码
def moveUp():
"""
选中的行向上移
:return: 实际移动的行数
"""
count = 0 # 统计移动数
self.selectionModel().clearSelection() # 清空选择
index = 0 # 移动项目序号,是多行移动,还要考虑除选择首行外其他行是否达到上方
rows # 获取选中要移动的所有行号列表
for row in rows : # 遍历所有要移动的行
if row == index: 是否移到最上方(因为是多行,不能简单地判断 row == 0)
index += 1 # 累计达到上方的行数
self.selectRow(row) # 选中行(移动完后要选中原来的行)
continue # 结束该行的操作
# 下面是一般行正常的向上移动操作
行交换方法(row, row - 1) # 上移一行,交换行是预选编写的方法,实现两行之间的数据交换
self.selectRow(row - 1) # 选中移动后的行
count += 1
return count
def moveDown():
"""
选中的行向上移
:return:实际移动的行数
"""
self.selectionModel().clearSelection() # 清空选择
count = 0 # 统计移动数
index = 0 # 移动项目序号,要考虑除选择首行外其他行是否达到下方
rows # 获取选中要移动的所有行号列表
for row in reversed(rows): # 要倒序遍历选中的行
if row == self.rowCount() - index - 1: 是否移到最下方(因为是多行,不能简单地判断 row == self.rowCount() - 1)
index += 1
self.selectRow(row) # 选中
continue # 结束该行的操作
# 下面是一般行正常的向下移动操作
行交换方法(row, row + 1) # 下移一行,交换行是预选编写的方法,实现两行之间的数据交换
self.selectRow(row + 1) # 选中移动后的行
count += 1
return count
置顶、置底比较简单,就不写了 |