You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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相关包。
  • 对比官方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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:28