pyqt5 - 修饰键可以拖放拖放

时间:2017-01-08 11:04:20

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

我正在使用两个QTableWidgets在python 3.5和Qt5.7中创建应用程序,我希望能够将其中一个表中的项目放入另一个表中。我在两个表上设置了拖放设置,一切正常,直到我按下一个修改键(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的机器。

1 个答案:

答案 0 :(得分:1)

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