pyqt5 - клавиша-модификатор ломает перетаскивание

Я делаю приложение в Python 3.5 и Qt5.7 с двумя QTableWidgets, и я хочу иметь возможность перетаскивать элементы из одной таблицы в другую. Я установил параметры перетаскивания в обеих таблицах, и все работает правильно, пока я не нажму клавишу-модификатор (Ctrl, Alt, Shift и т. Д.). С этого момента функция перетаскивания перестает работать.

Я уже пытался создать подкласс таблицы и переопределить события dnd (QDragEnterEvent, QDragMoveEvent, QDropEvent) без успеха. Я также попытался переопределить события мыши, используя mousePreseEvent, чтобы перехватить начальную точку перетаскивания, и mouseMoveEvent, чтобы создать перетаскивание с правильным mimetype, и создать eventFilter, чтобы перехватить клавиши-модификаторы и отключить их при необходимости, но ни одно из них не сработало.

Используя события перетаскивания, я вижу, что после нажатия любой из клавиш-модификаторов, когда вы начинаете движение перетаскивания, создается событие перетаскивания, но сразу после этого также создается событие сброса, и dnd останавливается, даже не двигая мышь.,

У кого-нибудь есть решение или знает причину такого поведения?

Я присоединяю простой код, сгенерированный с помощью pyuic5 от дизайнера Qt5.7, с двумя QListWidget, где можно наблюдать ту же проблему.

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.

1 ответ

Решение

Наконец, я нашел причину проблемы и не имел ничего общего ни с одним из фреймворков. Это было вызвано программным обеспечением для использования более одного компьютера с одной и той же мышью и клавиатурой по сети.

Другие вопросы по тегам