pyqt5 - 修改键中断拖放
pyqt5 - modifier key breaks drag and drop
我正在使用两个 QTableWidgets 在 python 3.5 和 Qt5.7 中制作一个应用程序,我希望能够将项目从 table 之一拖放到另一个。我在两个 table 上都设置了拖放设置,一切正常,直到我按下修改键(Ctrl、Alt、Shift 等)。从这一刻起,拖放功能将停止工作。
我已经尝试子类化 table 并重新实现 dnd 事件(QDragEnterEvent、QDragMoveEvent、QDropEvent)但没有成功。我还尝试使用 mousePreseEvent 重新实现鼠标事件以捕获拖动起点,使用 mouseMoveEvent 以创建具有正确 mimetype 的拖动,并创建一个 eventFilter 以捕获修改键并在需要时禁用它们,但 none成功了。
使用拖放事件我可以看到,在开始拖动运动时按下任何修改键后,将创建拖动事件,但紧接着也会创建拖放事件,并且 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_())
仅供参考开发系统是Windows10.
的机器
终于找到了问题的原因,与任何框架都没有关系。它是由一个软件引起的,该软件通过网络使用具有相同鼠标和键盘的多台计算机。
我正在使用两个 QTableWidgets 在 python 3.5 和 Qt5.7 中制作一个应用程序,我希望能够将项目从 table 之一拖放到另一个。我在两个 table 上都设置了拖放设置,一切正常,直到我按下修改键(Ctrl、Alt、Shift 等)。从这一刻起,拖放功能将停止工作。
我已经尝试子类化 table 并重新实现 dnd 事件(QDragEnterEvent、QDragMoveEvent、QDropEvent)但没有成功。我还尝试使用 mousePreseEvent 重新实现鼠标事件以捕获拖动起点,使用 mouseMoveEvent 以创建具有正确 mimetype 的拖动,并创建一个 eventFilter 以捕获修改键并在需要时禁用它们,但 none成功了。
使用拖放事件我可以看到,在开始拖动运动时按下任何修改键后,将创建拖动事件,但紧接着也会创建拖放事件,并且 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_())
仅供参考开发系统是Windows10.
的机器终于找到了问题的原因,与任何框架都没有关系。它是由一个软件引起的,该软件通过网络使用具有相同鼠标和键盘的多台计算机。