Как динамический добавить кнопки в QTableWidget

Подскажите как добавить рекурсивно кнопки в QTableWidget?

Программа берез из списка rows IP и номера. Хотелось бы прикрутить кнопки в таком же количестве что и первые 2 стобца. Спасибо!

from PyQt5.QtWidgets import QTableWidgetItem
from GUI import *
import sys
import psycopg2



class Widget(Qt.QWidget):

    def __init__(self):
        super().__init__()

class mywindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.connect)
        self.ui.lineEdit.setText('')



    def connect(self):
        num = self.ui.lineEdit.text()
        self.statusBar().showMessage('')
        if len(num) < 4:
            pass
            self.statusBar().showMessage(f'Номер состоит из 4х цифр, ты ввел меньше')
            self.show()
        elif len(num) > 4:
            pass
            self.statusBar().showMessage(f'Номер состоит из 4х цифр, ты ввел больше')
            self.show()
        elif num.isdigit() == False:
            pass
            self.statusBar().showMessage(f'Достустимо вводить только цифры, номер состоит из 4х цифр')
            self.show()
        else:

            rows = [('10.16.26.25', 2), ('10.16.26.26', 3), ('10.16.26.27', 1), ('10.16.26.28', 4)]
            for row in rows:
                pass

            print(rows)
##            rows.sort()
            for i,entry in enumerate(rows):
                self.ui.tableWidget.setRowCount(i+1)
                self.ui.tableWidget.setColumnCount(4)
                self.ui.tableWidget.setSortingEnabled(True)
                self.ui.tableWidget.sortItems(0-3)
            row = 0

            for tup in rows:
                col = 0
                for item in tup:
                    cellinfo = QTableWidgetItem(item)
                    cellinfo.setFlags(
                        QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
                    )
                    self.ui.tableWidget.setItem(row, col, cellinfo)
                    col += 1
                row += 1
            number = 0

            for x in rows:
                col = 1
                for item in str(x[1]):
                    cellinfo = QTableWidgetItem(item)
                    cellinfo.setFlags(
                        QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
                    )
                    self.ui.tableWidget.setItem(number, col, cellinfo)
                    col += 1
                number += 1

    def addButton(self, row, column):
        self.setCellWidget(row, column + 1, self.button)



app = QtWidgets.QApplication([])
win = mywindow()
win.show()

sys.exit(app.exec())

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


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

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

void QTableWidget::setCellWidget(int row, int column, QWidget *widget)

Устанавливает данный виджет для отображения в ячейке в данной строке и столбце, передавая владение виджетом таблице.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#from PyQt5.Qt import *
# ? from GUI import *
# ? import psycopg2


# ? class Widget(QWidget):
# ?     def __init__(self):
# ?         super().__init__()


class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        '''
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.connect)
        self.ui.lineEdit.setText('')
        '''

        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)

        self.rows = [
            ('10.16.26.25', 2), 
            ('10.16.26.26', 3), 
            ('10.16.26.27', 1), 
            ('10.16.26.28', 4)
        ] 
        
        self.lineEdit = QtWidgets.QLineEdit(placeholderText='Введите номер из 4х цифр')
        
        self.pushButton = QtWidgets.QPushButton('Создать TableWidget')
        self.pushButton.clicked.connect(self.func_connect)
        
        self.tableWidget = QtWidgets.QTableWidget(0, 4)
        self.tableWidget.setHorizontalHeaderLabels(
            ['IP', 'Number', 'SSH', 'VNC'])
        self.tableWidget.horizontalHeader().setDefaultSectionSize(150)        
            
        self.layout = QtWidgets.QGridLayout(self.centralwidget)   
        self.layout.addWidget(self.tableWidget)      
        self.layout.addWidget(self.lineEdit) 
        self.layout.addWidget(self.pushButton) 
        
        self.statusBar().showMessage('Message in statusbar. '
            'Будет Скрыто через 5000 миллисекунд - 5 секунды! ', 5000)
        
    def func_connect(self):
        num = self.lineEdit.text()
        if not num.isdigit():
            self.statusBar().showMessage(
                'Достустимо вводить только цифры, номер состоит из 4х цифр')
            return
        if len(num) != 4 : 
            self.statusBar().showMessage('Номер состоит из 4х цифр, повторите ввод.')
            return
        self.statusBar().showMessage('')    

        self.tableWidget.setRowCount(len(self.rows))
        for row, items in enumerate(self.rows):
            self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(items[0]))              
            self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(items[1])))

            button = QtWidgets.QPushButton(f'SSH {row}')
            button.clicked.connect(lambda ch, ip=items[0], n=items[1], btn=button: \
                self.button_pushed_SSH(ip, n, btn))
            self.tableWidget.setCellWidget(row, 2, button)         

            button = QtWidgets.QPushButton(f'VNC {row}')
            button.clicked.connect(lambda ch, ip=items[0], n=items[1], btn=button: \
                self.button_pushed_VNC(ip, n, btn))
            self.tableWidget.setCellWidget(row, 3, button) 
        self.tableWidget.setSortingEnabled(True)

    def button_pushed_SSH(self, ip, n, btn): 
        print(f'{btn.text()}: ip={ip}, n={n}')

    def button_pushed_VNC(self, ip, n, btn): 
        print(f'{btn.text()}: ip={ip}, n={n}')    
            

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    win = MyWindow()
    win.resize(640, 480)
    win.show()
    sys.exit(app.exec_())

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

→ Ссылка