У меня в главном окне есть 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
Перетащите элементы из QListWidget в QTableWidget в pyQT. ⇐ Python
Программы на Python
-
Anonymous
1731503471
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_())
Подробнее здесь: [url]https://stackoverflow.com/questions/79185036/drag-items-from-qlistwidget-and-drop-it-to-the-qtablewidget-in-pyqt[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия