【问题标题】:pyqt5 - modifier key breaks drag and droppyqt5 - 修饰键中断拖放
【发布时间】:2017-01-08 11:04:20
【问题描述】:

我正在 python 3.5 和 Qt5.7 中使用两个 QTableWidgets 制作应用程序,我希望能够将项目从其中一个表拖放到另一个表中。我在两个表上都设置了拖放设置,一切正常,直到我按下修饰键(Ctrl、Alt、Shift 等)。从这一刻起,拖放功能停止工作。

我已经尝试对表进行子类化并重新实现 dnd 事件(QDragEnterEvent、QDragMoveEvent、QDropEvent)但没有成功。我还尝试使用 mousePreseEvent 重新实现鼠标事件以捕获拖动起点,并使用 mouseMoveEvent 创建具有正确 mimetype 的拖动,并创建一个 eventFilter 来捕获修饰键并在需要时禁用它们,但它们都不起作用。

使用拖放事件,我可以看到,在开始拖动移动时按下任何修改键后,会创建拖动事件,但之后也会创建放置事件,并且 dnd 甚至没有停止移动鼠标。

有没有人有解决方案或知道这种行为的原因?

我附上了一个使用 Qt5.7 设计器的 pyuic5 生成的简单代码,其中有两个 QListWidgets 可以观察到相同的问题。

from PyQt5 import QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setDragEnabled(True)
        self.listWidget.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly)
        item = QtWidgets.QListWidgetItem()
        item.setText("1")
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        item.setText("2")
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        item.setText("3")
        self.listWidget.addItem(item)
        self.listWidget.setSortingEnabled(False)
        self.horizontalLayout.addWidget(self.listWidget)
        self.listWidget_2 = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget_2.setDragEnabled(True)
        self.listWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
        self.listWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
        item = QtWidgets.QListWidgetItem()
        item.setText("1")
        self.listWidget_2.addItem(item)
        item = QtWidgets.QListWidgetItem()
        item.setText("2")
        self.listWidget_2.addItem(item)
        item = QtWidgets.QListWidgetItem()
        item.setText("3")
        self.listWidget_2.addItem(item)
        self.listWidget_2.setSortingEnabled(False)
        self.horizontalLayout.addWidget(self.listWidget_2)
        MainWindow.setCentralWidget(self.centralwidget)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

开发系统为Windows 10机器,仅供参考。

【问题讨论】:

  • FWIW,示例代码在 Linux 上对我来说工作正常(有或没有修改键)。
  • 感谢您的提示!这似乎与我的开发平台有关。我尝试在其他 Windows 10 机器上运行代码,它运行完美......我仍然不知道是什么让它坏了,但至少我可以继续开发。

标签: python drag-and-drop pyqt pyqt5 modifier-key


【解决方案1】:

最后我找到了问题的原因,并且与任何框架都没有关系。它是由一个软件在网络上使用具有相同鼠标和键盘的多台计算机引起的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2018-06-15
    • 1970-01-01
    • 2012-05-31
    • 2017-05-27
    • 2018-10-18
    相关资源
    最近更新 更多