Не получается скопировать строку в QTableWidget дочернего окна из QTableWidget основного окна

я не могу разобраться, как при нажатии на кнопку "Добавить", скопировать строку с характеристиками итема в таблицу дочернего окна.

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
 
 
class MainWindow(QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.setFixedSize(600, 450)
        table = QTableWidget(self)
        table.setGeometry(0, 0, 600, 400)
 
        btn2 = QPushButton(self)
        btn2.setGeometry(250, 400, 100, 40)
        btn2.setText("Окно 2")
        btn2.clicked.connect(self.open_second_window)
 
        table.insertRow(0)
        row_header = ['Процессор']
        table.setVerticalHeaderLabels(row_header)
        for i in range(7):
            table.insertColumn(i)
 
        self.btn = QPushButton("Добавить")
        self.btn.clicked.connect(self.add_cpu)
        table.setCellWidget(0, 6, self.btn)
 
        item = QTableWidgetItem()
        item.setText("Intel")
        table.setItem(0, 0, item)
 
        item2 = QTableWidgetItem()
        item2.setText("i3 8100")
        table.setItem(0, 1, item2)
 
        item3 = QTableWidgetItem()
        item3.setText("3,6 Ghz")
        table.setItem(0, 2, item3)
 
        item4 = QTableWidgetItem()
        item4.setText("4 cores")
        table.setItem(0, 3, item4)
 
        item5 = QTableWidgetItem()
        item5.setText("4 threads")
        table.setItem(0, 4, item5)
 
        item6 = QTableWidgetItem()
        item6.setText("65W")
        table.setItem(0, 5, item6)
 
        table.resizeColumnsToContents()
 
    def open_second_window(self):
 
        self.window = SecondWindow(self)
        self.window.show()
 
    def add_cpu(self):
        pass
 
 
class SecondWindow(QMainWindow):
 
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setFixedSize(600, 450)
        table2 = QTableWidget(self)
        table2.setGeometry(0, 0, 600, 400)
        table2.insertRow(0)
        for i in range(8):
            table2.insertColumn(i)
        row_header = ['Процессор']
        column_headers = ['1', '2', '3', '4', '5', '6', '7', '8']
        table2.setVerticalHeaderLabels(row_header)
        table2.setHorizontalHeaderLabels(column_headers)
 
 
App = QApplication(sys.argv)
a = MainWindow()
a.show()
sys.exit(App.exec())

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


Ответы (1 шт):

Автор решения: S. Nick

QTableWidgetItem *QTableWidget::item(int row, int column) const

Возвращает элемент для данной строки и столбца, если он был установлен; в противном случае возвращает nullptr.


void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)

Устанавливает элемент для данной строки и столбца как item. Таблица становится владельцем элемента.

import sys
#from PyQt5 import uic
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *



class SecondWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(890, 200)
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.table2 = QTableWidget()
        self.table2.insertRow(0)
        for i in range(8):
            self.table2.insertColumn(i)
        row_header = ['Процессор']
        column_headers = ['1', '2', '3', '4', '5', '6', '7', '8']
        self.table2.setVerticalHeaderLabels(row_header)
        self.table2.setHorizontalHeaderLabels(column_headers)
        
        gridLayout = QtWidgets.QGridLayout(self.centralWidget)
        gridLayout.addWidget(self.table2)        
        

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.myDict = {}
                
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
        
        row = 0                                                             # +++ 
        self.btn = QPushButton("Добавить")
        self.btn.clicked.connect(lambda ch, row=row : self.add_cpu(row))    # +++ 

        btn2 = QPushButton(self)
        btn2.setText("Окно 2")
        btn2.clicked.connect(self.open_second_window)
        
        self.table = QTableWidget()
        self.table.insertRow(0)
        row_header = ['Процессор']
        self.table.setVerticalHeaderLabels(row_header)
        for i in range(7):
            self.table.insertColumn(i)
        self.table.setCellWidget(0, 6, self.btn)

        item = QTableWidgetItem()
        item.setText("Intel")
        self.table.setItem(0, 0, item)
        item2 = QTableWidgetItem()
        item2.setText("i3 8100")
        self.table.setItem(0, 1, item2)
        item3 = QTableWidgetItem()
        item3.setText("3,6 Ghz")
        self.table.setItem(0, 2, item3)
        item4 = QTableWidgetItem()
        item4.setText("4 cores")
        self.table.setItem(0, 3, item4)
        item5 = QTableWidgetItem()
        item5.setText("4 threads")
        self.table.setItem(0, 4, item5)
        item6 = QTableWidgetItem()
        item6.setText("65W")
        self.table.setItem(0, 5, item6)
        self.table.resizeColumnsToContents()
        
        gridLayout = QtWidgets.QGridLayout(self.centralWidget)
        gridLayout.addWidget(self.table)
        gridLayout.addWidget(btn2)

        self.window = SecondWindow(self)
        
    def open_second_window(self):
#        self.window = SecondWindow(self)
        self.window.show()

    def add_cpu(self, row):
        #print(f'row = {row}')
        _list = []
        columns = self.table.columnCount()
        for column in range(columns):        
            item = self.table.item(row, column) 
            item = item.text() if item else ''
            _list.append(item)
      
        self.myDict[row] = _list
        #print(self.myDict)
        
        for row, columns in self.myDict.items():
            for col, column in enumerate(columns):
                self.window.table2.setItem(row, col, QtWidgets.QTableWidgetItem(str(column)))
      

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(600, 450)
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка