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()

Код на pastebin design.py

С таблицей 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()

введите сюда описание изображения

введите сюда описание изображения

Попробуйте, если что не так, напишите.

→ Ссылка