PYQT5 拖放行在 TableWidget 中没有按预期工作
PYQT5 Drag and Drop Rows not Working as intended inside TableWidget
我是初学者,我正在开发一种工具,用户可以在该工具中重新排列具有 2 列的 table 小部件中的文件行。
问题是当拖放一行时,目标被删除。
我在以下位置找到了解决方案:Drag and drop rows within QTableWidget
但我似乎无法让它在我的代码上运行。有人可以指出我应该从哪里开始吗?我不明白应该在哪里添加布局和拖放事件 class。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIntValidator, QDropEvent
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QWidget, QHBoxLayout, QApplication
from PyQt5.QtCore import QSettings, Qt
from pathlib import Path
import os
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(647, 564)
MainWindow.setAutoFillBackground(False)
MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(190, 130, 81, 31))
self.pushButton_4.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton_4.setObjectName("Browse")
self.pushButton_4.clicked.connect(self.browseFiles)
self.tableWidget_2 = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_2.setGeometry(QtCore.QRect(300, 20, 321, 391))
self.tableWidget_2.setAutoFillBackground(True)
self.tableWidget_2.setFrameShape(QtWidgets.QFrame.Box)
self.tableWidget_2.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
self.tableWidget_2.setDragEnabled(True)
self.tableWidget_2.setAcceptDrops(True)
self.tableWidget_2.viewport().setAcceptDrops(True)
self.tableWidget_2.setDragDropOverwriteMode(False)
self.tableWidget_2.setDropIndicatorShown(True)
self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.tableWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.tableWidget_2.setAlternatingRowColors(True)
self.tableWidget_2.setIconSize(QtCore.QSize(5, 5))
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(2)
self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setHorizontalHeaderLabels(["Filename","Page Count"])
self.tableWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.pushButton_4.raise_()
self.tableWidget_2.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_4.setText(_translate("MainWindow", "Browse"))
def browseFiles(self):
self.pdfFiles = []
lastPath = ""
numRows = self.tableWidget_2.rowCount()
options = QFileDialog.Options()
# options |= QFileDialog.DontUseNativeDialog
files, _ = QFileDialog.getOpenFileNames(MainWindow,"Select File(s)", "","Files (*.*)", options=options)
for file in files:
self.tableWidget_2.insertRow(numRows)
self.tableWidget_2.setItem(numRows, 0, QtWidgets.QTableWidgetItem(file))
if len(self.pdfFiles) > 0:
lastPath = os.path.dirname(os.path.abspath(str(files)))
self.lineEdit_3.setText(lastPath)
self.disableButton()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
MainWindow.setWindowTitle("ARCMAP")
sys.exit(app.exec_())
```
已修复。必须推广我的 table 小部件并在此处导入 TableWidgetDragRows class:Drag and drop rows within QTableWidget.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIntValidator, QDropEvent
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QWidget, QHBoxLayout, QApplication
from PyQt5.QtCore import QSettings, Qt
from pathlib import Path
import os
#import the tableWidgetDragRows in the link
from tablewidgetdragrows import TableWidgetDragRows
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(647, 564)
MainWindow.setAutoFillBackground(False)
MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(190, 130, 81, 31))
self.pushButton_4.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton_4.setObjectName("Browse")
self.pushButton_4.clicked.connect(self.browseFiles)
#edit the tableWidget from default to the imported sub class
self.tableWidget_2 = TableWidgetDragRows(self.centralwidget)
self.tableWidget_2.setGeometry(QtCore.QRect(300, 20, 321, 391))
self.tableWidget_2.setAutoFillBackground(True)
self.tableWidget_2.setFrameShape(QtWidgets.QFrame.Box)
self.tableWidget_2.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
#remove all drag and drop functions from your table widget so it would inherit from the imported subclass
# self.tableWidget_2.setDragEnabled(True)
# self.tableWidget_2.setAcceptDrops(True)
# self.tableWidget_2.viewport().setAcceptDrops(True)
# self.tableWidget_2.setDragDropOverwriteMode(False)
# self.tableWidget_2.setDropIndicatorShown(True)
# self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
# self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
# self.tableWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.tableWidget_2.setAlternatingRowColors(True)
self.tableWidget_2.setIconSize(QtCore.QSize(5, 5))
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(2)
self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setHorizontalHeaderLabels(["Filename","Page Count"])
self.tableWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.pushButton_4.raise_()
self.tableWidget_2.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_4.setText(_translate("MainWindow", "Browse"))
def browseFiles(self):
self.pdfFiles = []
lastPath = ""
numRows = self.tableWidget_2.rowCount()
options = QFileDialog.Options()
# options |= QFileDialog.DontUseNativeDialog
files, _ = QFileDialog.getOpenFileNames(MainWindow,"Select File(s)", "","Files (*.*)", options=options)
for file in files:
self.tableWidget_2.insertRow(numRows)
self.tableWidget_2.setItem(numRows, 0, QtWidgets.QTableWidgetItem(file))
if len(self.pdfFiles) > 0:
lastPath = os.path.dirname(os.path.abspath(str(files)))
self.lineEdit_3.setText(lastPath)
self.disableButton()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
MainWindow.setWindowTitle("ARCMAP")
sys.exit(app.exec_())
```
我是初学者,我正在开发一种工具,用户可以在该工具中重新排列具有 2 列的 table 小部件中的文件行。
问题是当拖放一行时,目标被删除。
我在以下位置找到了解决方案:Drag and drop rows within QTableWidget
但我似乎无法让它在我的代码上运行。有人可以指出我应该从哪里开始吗?我不明白应该在哪里添加布局和拖放事件 class。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIntValidator, QDropEvent
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QWidget, QHBoxLayout, QApplication
from PyQt5.QtCore import QSettings, Qt
from pathlib import Path
import os
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(647, 564)
MainWindow.setAutoFillBackground(False)
MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(190, 130, 81, 31))
self.pushButton_4.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton_4.setObjectName("Browse")
self.pushButton_4.clicked.connect(self.browseFiles)
self.tableWidget_2 = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_2.setGeometry(QtCore.QRect(300, 20, 321, 391))
self.tableWidget_2.setAutoFillBackground(True)
self.tableWidget_2.setFrameShape(QtWidgets.QFrame.Box)
self.tableWidget_2.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
self.tableWidget_2.setDragEnabled(True)
self.tableWidget_2.setAcceptDrops(True)
self.tableWidget_2.viewport().setAcceptDrops(True)
self.tableWidget_2.setDragDropOverwriteMode(False)
self.tableWidget_2.setDropIndicatorShown(True)
self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.tableWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.tableWidget_2.setAlternatingRowColors(True)
self.tableWidget_2.setIconSize(QtCore.QSize(5, 5))
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(2)
self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setHorizontalHeaderLabels(["Filename","Page Count"])
self.tableWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.pushButton_4.raise_()
self.tableWidget_2.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_4.setText(_translate("MainWindow", "Browse"))
def browseFiles(self):
self.pdfFiles = []
lastPath = ""
numRows = self.tableWidget_2.rowCount()
options = QFileDialog.Options()
# options |= QFileDialog.DontUseNativeDialog
files, _ = QFileDialog.getOpenFileNames(MainWindow,"Select File(s)", "","Files (*.*)", options=options)
for file in files:
self.tableWidget_2.insertRow(numRows)
self.tableWidget_2.setItem(numRows, 0, QtWidgets.QTableWidgetItem(file))
if len(self.pdfFiles) > 0:
lastPath = os.path.dirname(os.path.abspath(str(files)))
self.lineEdit_3.setText(lastPath)
self.disableButton()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
MainWindow.setWindowTitle("ARCMAP")
sys.exit(app.exec_())
```
已修复。必须推广我的 table 小部件并在此处导入 TableWidgetDragRows class:Drag and drop rows within QTableWidget.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIntValidator, QDropEvent
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QWidget, QHBoxLayout, QApplication
from PyQt5.QtCore import QSettings, Qt
from pathlib import Path
import os
#import the tableWidgetDragRows in the link
from tablewidgetdragrows import TableWidgetDragRows
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(647, 564)
MainWindow.setAutoFillBackground(False)
MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(190, 130, 81, 31))
self.pushButton_4.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton_4.setObjectName("Browse")
self.pushButton_4.clicked.connect(self.browseFiles)
#edit the tableWidget from default to the imported sub class
self.tableWidget_2 = TableWidgetDragRows(self.centralwidget)
self.tableWidget_2.setGeometry(QtCore.QRect(300, 20, 321, 391))
self.tableWidget_2.setAutoFillBackground(True)
self.tableWidget_2.setFrameShape(QtWidgets.QFrame.Box)
self.tableWidget_2.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
#remove all drag and drop functions from your table widget so it would inherit from the imported subclass
# self.tableWidget_2.setDragEnabled(True)
# self.tableWidget_2.setAcceptDrops(True)
# self.tableWidget_2.viewport().setAcceptDrops(True)
# self.tableWidget_2.setDragDropOverwriteMode(False)
# self.tableWidget_2.setDropIndicatorShown(True)
# self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
# self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
# self.tableWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.tableWidget_2.setAlternatingRowColors(True)
self.tableWidget_2.setIconSize(QtCore.QSize(5, 5))
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(2)
self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setHorizontalHeaderLabels(["Filename","Page Count"])
self.tableWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.pushButton_4.raise_()
self.tableWidget_2.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_4.setText(_translate("MainWindow", "Browse"))
def browseFiles(self):
self.pdfFiles = []
lastPath = ""
numRows = self.tableWidget_2.rowCount()
options = QFileDialog.Options()
# options |= QFileDialog.DontUseNativeDialog
files, _ = QFileDialog.getOpenFileNames(MainWindow,"Select File(s)", "","Files (*.*)", options=options)
for file in files:
self.tableWidget_2.insertRow(numRows)
self.tableWidget_2.setItem(numRows, 0, QtWidgets.QTableWidgetItem(file))
if len(self.pdfFiles) > 0:
lastPath = os.path.dirname(os.path.abspath(str(files)))
self.lineEdit_3.setText(lastPath)
self.disableButton()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
MainWindow.setWindowTitle("ARCMAP")
sys.exit(app.exec_())
```