Ubuntu 23.04下PyQt6的QListWidget拖拽排序功能失效问题
PyQt6 QListWidget拖拽排序功能失效排查
我在PyQt6中实现了支持拖拽排序的QListWidget,但数月前该功能突然失效,无法重新排序列表。相同代码在其他设备上可正常运行。当前环境为Ubuntu 23.04、PyQt 6.5、Conda环境下的Python 3.10.11,推测是系统或Qt编译问题,但无从下手,请求协助排查。
最小复现示例代码
from PyQt6.QtWidgets import * from PyQt6.QtCore import * from PyQt6.QtGui import * class MainWindow(QWidget): def __init__(self): super().__init__() list_widget = QListWidget() # I've tried all combinations of the following calls list_widget.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) list_widget.setDragEnabled(True) list_widget.viewport().setAcceptDrops(True) list_widget.setDropIndicatorShown(True) list_widget.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) list_widget.addItem("Item 1") list_widget.addItem("Item 2") list_widget.addItem("Item 3") list_widget.addItem("Item 4") layout = QVBoxLayout() layout.addWidget(list_widget) self.setLayout(layout) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec()
排查方向
- 切换到Xorg会话测试:Ubuntu 23.04默认使用Wayland,部分Qt应用在Wayland下存在拖拽兼容性问题。登录时点击屏幕右上角的齿轮图标,选择"Ubuntu on Xorg",重启后运行代码验证功能是否恢复。
- 验证Conda环境纯净性:
- 创建全新Conda环境,仅安装必要依赖:
conda create -n test_pyqt_drag python=3.10 pyqt6 conda activate test_pyqt_drag python your_test_script.py - 检查当前环境是否存在Qt版本冲突:执行
conda list | grep qt,确保没有同时安装Qt5和Qt6相关包。
- 创建全新Conda环境,仅安装必要依赖:
- 对比官方PyQt包:退出Conda环境,使用系统Python通过pip安装PyQt6(
pip install pyqt6),运行测试代码,排查是否是Conda编译的Qt包存在问题。 - 更新系统组件:执行以下命令安装系统最新补丁,修复可能存在的Wayland或Qt系统库bug:
sudo apt update && sudo apt upgrade -y - 调试拖拽事件:自定义QListWidget子类,重载拖拽相关事件并打印日志,确认事件是否被正确接收:
将原代码中的class DebugListWidget(QListWidget): def dragEnterEvent(self, event): print(f"Drag enter received: {event}") super().dragEnterEvent(event) def dragMoveEvent(self, event): print(f"Drag move received: {event}") super().dragMoveEvent(event) def dropEvent(self, event): print(f"Drop received: {event}") super().dropEvent(event)QListWidget替换为DebugListWidget,运行后观察控制台输出,判断事件流是否正常。
内容的提问来源于stack exchange,提问作者Jordi Torrents
相关产品推荐
相关产品推荐

