QTableWidget, копировать данные между таблицами
Есть небольшое приложение сделанное с помощью Qt Designer, в нем есть две таблицы QTableWidget с некими данными (DataTable_1, DataTable_2).
Нашел подходящие мне решение(https://quares.ru/?id=193989), но к сожалению не могу его правильно применить для себя.
Вот так я сделал:
import sys
from PyQt5 import QtWidgets, QtCore
import design
class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.deleteRow_1.clicked.connect(self.delete_row_1)
self.addRow_1.clicked.connect(self.add_row_1)
self.deleteRow_2.clicked.connect(self.delete_row_2)
self.addRow_2.clicked.connect(self.add_row_2)
def keyPressEvent(self, event):
super().keyPressEvent(event)
if event.key() == QtCore.Qt.Key_C and (event.modifiers() & QtCore.Qt.ControlModifier):
self.DataTable_1.copied_cells = sorted(self.DataTable_1.selectedIndexes())
elif event.key() == QtCore.Qt.Key_V and (event.modifiers() & QtCore.Qt.ControlModifier):
r = self.DataTable_1.currentRow() - self.DataTable_1.copied_cells[0].row()
c = self.DataTable_1.currentColumn() - self.DataTable_1.copied_cells[0].column()
for cell in self.DataTable_1.copied_cells:
self.DataTable_1.setItem(cell.row() + r, cell.column() + c, QtWidgets.QTableWidgetItem(cell.data()))
def add_row_1(self):
row_position = self.DataTable_1.rowCount()
self.DataTable_1.insertRow(row_position)
def delete_row_1(self):
rows = set()
for index in self.DataTable_1.selectedIndexes():
rows.add(index.row())
for row in sorted(rows, reverse=True):
self.DataTable_1.removeRow(row)
def add_row_2(self):
row_position = self.DataTable_2.rowCount()
self.DataTable_2.insertRow(row_position)
def delete_row_2(self):
rows = set()
for index in self.DataTable_2.selectedIndexes():
rows.add(index.row())
for row in sorted(rows, reverse=True):
self.DataTable_2.removeRow(row)
def main():
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
С таблицей DataTable_1 все работает как нужно, но я не могу сделать тоже самое для таблицы DataTable_2. В идеале также хотелось бы чтобы данные можно было копировать между таблицами.
Спасибо.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я попробовал что-то сделать для вас и отметил блок, в который вне изменения.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtWidgets, QtCore
#import design
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(602, 421)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setStyleSheet("")
MainWindow.setTabShape(QtWidgets.QTabWidget.Triangular)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
self.tabWidget.setSizePolicy(sizePolicy)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
self.horizontalLayout_3.setContentsMargins(-1, -1, 0, -1)
self.horizontalLayout_3.setSpacing(0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.addRow_1 = QtWidgets.QPushButton(self.tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.addRow_1.sizePolicy().hasHeightForWidth())
self.addRow_1.setSizePolicy(sizePolicy)
self.addRow_1.setText("")
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../+.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.addRow_1.setIcon(icon)
self.addRow_1.setObjectName("addRow_1")
self.horizontalLayout_3.addWidget(self.addRow_1)
self.deleteRow_1 = QtWidgets.QPushButton(self.tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.deleteRow_1.sizePolicy().hasHeightForWidth())
self.deleteRow_1.setSizePolicy(sizePolicy)
self.deleteRow_1.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.deleteRow_1.setBaseSize(QtCore.QSize(0, 0))
self.deleteRow_1.setAcceptDrops(False)
self.deleteRow_1.setStyleSheet("")
self.deleteRow_1.setText("")
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("../-.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.deleteRow_1.setIcon(icon1)
self.deleteRow_1.setIconSize(QtCore.QSize(18, 18))
self.deleteRow_1.setShortcut("")
self.deleteRow_1.setCheckable(False)
self.deleteRow_1.setAutoRepeat(False)
self.deleteRow_1.setAutoExclusive(False)
self.deleteRow_1.setAutoDefault(False)
self.deleteRow_1.setFlat(False)
self.deleteRow_1.setObjectName("deleteRow_1")
self.horizontalLayout_3.addWidget(self.deleteRow_1)
self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.DataTable_1 = QtWidgets.QTableWidget(self.tab)
self.DataTable_1.setEnabled(True)
self.DataTable_1.setMouseTracking(False)
self.DataTable_1.setAcceptDrops(False)
self.DataTable_1.setLayoutDirection(QtCore.Qt.LeftToRight)
self.DataTable_1.setAutoFillBackground(False)
self.DataTable_1.setStyleSheet("")
self.DataTable_1.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.DataTable_1.setDragEnabled(True)
self.DataTable_1.setDragDropOverwriteMode(True)
self.DataTable_1.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.DataTable_1.setDefaultDropAction(QtCore.Qt.CopyAction)
self.DataTable_1.setTextElideMode(QtCore.Qt.ElideRight)
self.DataTable_1.setRowCount(0)
self.DataTable_1.setColumnCount(5)
self.DataTable_1.setObjectName("DataTable_1")
item = QtWidgets.QTableWidgetItem()
self.DataTable_1.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_1.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_1.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_1.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_1.setHorizontalHeaderItem(4, item)
self.DataTable_1.horizontalHeader().setVisible(True)
self.DataTable_1.horizontalHeader().setCascadingSectionResizes(False)
self.DataTable_1.horizontalHeader().setDefaultSectionSize(160)
self.DataTable_1.horizontalHeader().setHighlightSections(True)
self.DataTable_1.horizontalHeader().setMinimumSectionSize(20)
self.DataTable_1.horizontalHeader().setSortIndicatorShown(False)
self.DataTable_1.horizontalHeader().setStretchLastSection(True)
self.DataTable_1.verticalHeader().setVisible(True)
self.DataTable_1.verticalHeader().setDefaultSectionSize(37)
self.DataTable_1.verticalHeader().setHighlightSections(True)
self.DataTable_1.verticalHeader().setMinimumSectionSize(30)
self.DataTable_1.verticalHeader().setSortIndicatorShown(False)
self.DataTable_1.verticalHeader().setStretchLastSection(False)
self.verticalLayout_2.addWidget(self.DataTable_1)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
self.horizontalLayout_2.setContentsMargins(-1, -1, 0, -1)
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.addRow_2 = QtWidgets.QPushButton(self.tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.addRow_2.sizePolicy().hasHeightForWidth())
self.addRow_2.setSizePolicy(sizePolicy)
self.addRow_2.setText("")
self.addRow_2.setIcon(icon)
self.addRow_2.setObjectName("addRow_2")
self.horizontalLayout_2.addWidget(self.addRow_2)
self.deleteRow_2 = QtWidgets.QPushButton(self.tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.deleteRow_2.sizePolicy().hasHeightForWidth())
self.deleteRow_2.setSizePolicy(sizePolicy)
self.deleteRow_2.setStyleSheet("")
self.deleteRow_2.setText("")
self.deleteRow_2.setIcon(icon1)
self.deleteRow_2.setIconSize(QtCore.QSize(18, 18))
self.deleteRow_2.setShortcut("")
self.deleteRow_2.setCheckable(False)
self.deleteRow_2.setAutoRepeat(False)
self.deleteRow_2.setAutoExclusive(False)
self.deleteRow_2.setAutoDefault(False)
self.deleteRow_2.setFlat(False)
self.deleteRow_2.setObjectName("deleteRow_2")
self.horizontalLayout_2.addWidget(self.deleteRow_2)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.DataTable_2 = QtWidgets.QTableWidget(self.tab)
self.DataTable_2.setLayoutDirection(QtCore.Qt.LeftToRight)
self.DataTable_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.DataTable_2.setDragEnabled(True)
self.DataTable_2.setDragDropOverwriteMode(True)
self.DataTable_2.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.DataTable_2.setDefaultDropAction(QtCore.Qt.CopyAction)
self.DataTable_2.setObjectName("DataTable_2")
self.DataTable_2.setColumnCount(5)
self.DataTable_2.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.DataTable_2.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_2.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_2.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_2.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.DataTable_2.setHorizontalHeaderItem(4, item)
self.DataTable_2.horizontalHeader().setVisible(True)
self.DataTable_2.horizontalHeader().setCascadingSectionResizes(False)
self.DataTable_2.horizontalHeader().setDefaultSectionSize(160)
self.DataTable_2.horizontalHeader().setHighlightSections(True)
self.DataTable_2.horizontalHeader().setMinimumSectionSize(20)
self.DataTable_2.horizontalHeader().setSortIndicatorShown(False)
self.DataTable_2.horizontalHeader().setStretchLastSection(True)
self.DataTable_2.verticalHeader().setVisible(True)
self.DataTable_2.verticalHeader().setDefaultSectionSize(37)
self.DataTable_2.verticalHeader().setHighlightSections(True)
self.DataTable_2.verticalHeader().setMinimumSectionSize(30)
self.DataTable_2.verticalHeader().setSortIndicatorShown(False)
self.DataTable_2.verticalHeader().setStretchLastSection(False)
self.verticalLayout_2.addWidget(self.DataTable_2)
self.DataTable_1.raise_()
self.DataTable_2.raise_()
self.tabWidget.addTab(self.tab, "")
self.dfgd = QtWidgets.QWidget()
self.dfgd.setEnabled(False)
self.dfgd.setObjectName("dfgd")
self.tabWidget.addTab(self.dfgd, "")
self.verticalLayout.addWidget(self.tabWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "123"))
self.addRow_1.setToolTip(_translate("MainWindow", "<html><head/><body><p>Добавить строку</p></body></html>"))
self.addRow_1.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
self.deleteRow_1.setToolTip(_translate("MainWindow", "<html><head/><body><p>Удалить строку</p></body></html>"))
self.deleteRow_1.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
self.DataTable_1.setSortingEnabled(False)
item = self.DataTable_1.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.DataTable_1.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "2"))
item = self.DataTable_1.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.DataTable_1.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "4"))
item = self.DataTable_1.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "5"))
self.addRow_2.setToolTip(_translate("MainWindow", "<html><head/><body><p>Добавить строку</p></body></html>"))
self.addRow_2.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
self.deleteRow_2.setToolTip(_translate("MainWindow", "<html><head/><body><p>Удалить строку</p></body></html>"))
self.deleteRow_2.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
item = self.DataTable_2.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.DataTable_2.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "2"))
item = self.DataTable_2.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.DataTable_2.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "4"))
item = self.DataTable_2.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "5"))
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.deleteRow_1.clicked.connect(self.delete_row_1)
self.addRow_1.clicked.connect(self.add_row_1)
self.deleteRow_2.clicked.connect(self.delete_row_2)
self.addRow_2.clicked.connect(self.add_row_2)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.addRow_1.setText("addRow")
self.deleteRow_1.setText("deleteRow")
self.tw = None
self.copied_cells = None
self.DataTable_1.cellPressed.connect(
lambda row, col, tw=self.DataTable_1: self.selection_changed(row, col, tw))
self.DataTable_2.cellPressed.connect(
lambda row, col, tw=self.DataTable_2: self.selection_changed(row, col, tw))
def selection_changed(self, row, col, tw):
self.tw = tw
#print(f'tw = {tw.objectName()} - {row} - {col}')
def keyPressEvent(self, event):
super().keyPressEvent(event)
if not self.tw:
return
if event.key() == QtCore.Qt.Key_C and \
(event.modifiers() & QtCore.Qt.ControlModifier):
self.copied_cells = sorted(self.tw.selectedIndexes())
#print(f'copied_cells = {self.copied_cells}')
elif event.key() == QtCore.Qt.Key_V and \
(event.modifiers() & QtCore.Qt.ControlModifier):
if not self.copied_cells:
return
#print(f'objectName = {self.tw.objectName()}')
r = self.tw.currentRow() - self.copied_cells[0].row()
c = self.tw.currentColumn() - self.copied_cells[0].column()
#print(f'{r} - {c}')
for cell in self.copied_cells:
self.tw.setItem(
cell.row() + r, \
cell.column() + c, \
QtWidgets.QTableWidgetItem(cell.data())
)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def add_row_1(self):
row_position = self.DataTable_1.rowCount()
self.DataTable_1.insertRow(row_position)
def delete_row_1(self):
rows = set()
for index in self.DataTable_1.selectedIndexes():
rows.add(index.row())
for row in sorted(rows, reverse=True):
self.DataTable_1.removeRow(row)
def add_row_2(self):
row_position = self.DataTable_2.rowCount()
self.DataTable_2.insertRow(row_position)
def delete_row_2(self):
rows = set()
for index in self.DataTable_2.selectedIndexes():
rows.add(index.row())
for row in sorted(rows, reverse=True):
self.DataTable_2.removeRow(row)
def main():
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
Попробуйте, если что не так, напишите.

