pyqt5中重写QTableWidget,实现将文件拖拽进table并显示,然后在UI文件中调用重写的QTableWidget
时间: 2024-05-09 19:20:09 浏览: 16
以下是一个例子,展示如何在PyQt5中重写QTableWidget,以便将文件拖放到表中并显示它们:
```python
from PyQt5.QtWidgets import QTableWidget, QFileDialog
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag, QPixmap
class MyTableWidget(QTableWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setAcceptDrops(True) # 允许拖放
self.setSelectionMode(QTableWidget.SingleSelection) # 单选
self.setSelectionBehavior(QTableWidget.SelectRows) # 按行选择
self.setColumnCount(2)
self.setHorizontalHeaderLabels(['文件名', '路径'])
self.setRowCount(0)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dragMoveEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dropEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(Qt.CopyAction)
event.accept()
for url in event.mimeData().urls():
path = url.toLocalFile()
filename = path.split('/')[-1]
self.insertRow(self.rowCount())
self.setItem(self.rowCount() - 1, 0, QTableWidgetItem(filename))
self.setItem(self.rowCount() - 1, 1, QTableWidgetItem(path))
```
在这里,我们创建了一个名为`MyTableWidget`的新类,它继承自`QTableWidget`。我们重写了三个方法:`dragEnterEvent()`、`dragMoveEvent()`和`dropEvent()`。
`dragEnterEvent()`和`dragMoveEvent()`方法用于确定何时可接受拖放操作。在这个例子中,我们只接受文件拖放。如果`mimeData`对象中包含URL,则我们接受拖放并将其`acceptProposedAction()`,否则我们忽略它。
`dropEvent()`方法在拖放操作完成时被调用。我们获取拖动的文件路径,插入新行并在第一列中添加文件名,在第二列中添加文件路径。
现在,我们可以在UI文件中将`QTableWidget`替换为`MyTableWidget`:将`QTableWidget`替换为`MyTableWidget`,然后在`__init__()`方法中添加以下代码:
```python
self.tableWidget = MyTableWidget(self)
```
这样我们就可以使用重写后的`MyTableWidget`将文件拖放到表中并显示它们。