Перетащите элементы из QListWidget в QTableWidget в pyQT.Python

Программы на Python
Ответить
Anonymous
 Перетащите элементы из QListWidget в QTableWidget в pyQT.

Сообщение Anonymous »

У меня в главном окне есть QListWidget и QTableWidget. Мне нужно перетащить элемент из QListWidget и поместить его в QTableWidget в виде строки или столбца (зависит от того, будет ли событие вызвано из вертикального или горизонтального заголовка).
Но я невозможно настроить dropEvent для заголовков: перетаскивание элемента «Элемент 1» в таблицу между строками 2 и 3 должно добавить новую строку с именем «Элемент 1».
Изображение

Я пытался настроить событие в QTableWidget, но оно работает только для ячеек:
class customTable(QTableWidget):
def __init__(self, parent):
super().__init__(parent)
# Set Style
self.setStyleSheet(tableStyle)
# ScrollBars
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
# Allow to drop elements
# self.setDragEnabled(True)
# self.setDragDropOverwriteMode(True)
# self.setDragDropMode(QAbstractItemView.DragDrop)
# self.setDefaultDropAction(Qt.MoveAction)

# Allow to replace rows and columns in the table
self.verticalHeader().setSectionsMovable(True)
self.horizontalHeader().setSectionsMovable(True)

# verticalHeader Drop
self.verticalHeader().setDragEnabled(True)
self.verticalHeader().setDragDropOverwriteMode(True)
self.verticalHeader().setDragDropMode(QAbstractItemView.DropOnly)
# horizontalHeader Drop
self.horizontalHeader().setDragEnabled(True)
self.horizontalHeader().setDragDropOverwriteMode(True)
self.horizontalHeader().setDragDropMode(QAbstractItemView.DropOnly)

def dropEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
data = event.mimeData()
source_item = QStandardItemModel()
source_item.dropMimeData(data, Qt.CopyAction, 0,0, QModelIndex())
print(source_item.item(0, 0).text())

Есть предложения о том, как добиться желаемого поведения?
Код без специальной таблицы:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QAbstractItemView, QHBoxLayout, QWidget, QListWidget
from PyQt5.QtCore import Qt

tableStyle = '''
QTableWidget::item {background-color: "#F4FAFB";
border-style: outset;
border-width:1px; border-radius: 2px; border-color: #AEAEAE}
QTableWidget::item:selected {background-color: #66C3D0;
border-width:1px; border-radius: 2px; color: white; border-color: #333333}
'''

class TableDemo(QMainWindow):
def __init__(self):
super().__init__()

# Create a ListWidget
self.list = QListWidget(self)
self.list.addItem('Item 1')
self.list.addItem('Item 3')
self.list.addItem('Item 4')

# Set Drag and Drop
self.list.setDragDropMode(QAbstractItemView.DragOnly)

# Create a QTableWidget
self.table = QTableWidget(self)

# # Set Style
self.table.setStyleSheet(tableStyle)

# Set number of rows and columns
self.table.setRowCount(5)
self.table.setColumnCount(3)

# Set headers
self.table.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
self.table.setVerticalHeaderLabels(['Row 1', 'Row 2', 'Row 3', 'Row 4', 'Row 5'])

# ScrollBars
self.table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.table.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

# Allow to replace rows and columns in the table
self.table.verticalHeader().setSectionsMovable(True)
self.table.horizontalHeader().setSectionsMovable(True)

# Customize Drop Event
self.table.verticalHeader().setDragEnabled(True)
# self.table.verticalHeader().setDragDropOverwriteMode(True)
self.table.verticalHeader().setDragDropMode(QAbstractItemView.DropOnly)
self.table.horizontalHeader().setDragEnabled(True)
# self.table.horizontalHeader().setDragDropOverwriteMode(True)
self.table.horizontalHeader().setDragDropMode(QAbstractItemView.DropOnly)

# Populate the table with data
for row in range(5):
for col in range(3):
self.table.setItem(row, col, QTableWidgetItem(f"Item ({row+1}, {col+1})"))
# self.table.item(row,col).setText('New text')
# self.table.item(row, col).setFlags(Qt.ItemFlag.ItemIsDragEnabled | Qt.ItemFlag.ItemIsDropEnabled)

# Layout setup
layout = QHBoxLayout()
layout.addWidget(self.list)
layout.addWidget(self.table)

central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)

# Window properties
self.setWindowTitle("QTableWidget Demo")
self.resize(800, 300)

if __name__ == '__main__':
app = QApplication(sys.argv)
window = TableDemo()
window.show()
sys.exit(app.exec_())


Подробнее здесь: https://stackoverflow.com/questions/791 ... et-in-pyqt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»