Pyqt5. Передача кортежа с данными между объектами интерфейса (классами)

Подскажите пожалуйста как обработать сигнал в SearchResultBox, чтобы получить кортеж с данными по устройствам из SearchBox и вывести его в таблицу.

# -*- coding: utf-8 -*-

import sys
from PyQt5.QtCore import pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import (
    QApplication, QGridLayout, QMainWindow, QLineEdit, QLabel,QTableWidget, QHeaderView,
    QWidget, QGroupBox, QHBoxLayout, QPushButton
)

class SearchBox(QGroupBox):

    result_signal = pyqtSignal(tuple)

    def __init__(self, cucm_object: str, parent=None):

        super(SearchBox, self).__init__(parent)

        self.cucm_object = cucm_object

        self.setTitle(f"&Search {self.cucm_object}")

        self.search_line = QLineEdit()
        self.search_line.setFixedWidth(200)

        self.search_button = QPushButton("Search")
        self.search_button.clicked.connect(self.objects_search)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(self.search_line)
        h_layout.addWidget(self.search_button)
        h_layout.addStretch(1)

    @ pyqtSlot()
    def objects_search(self):

        # response = some_script(self.search_line.text())
        response = (
            {'id': '09c6295d-9021', 'name': 'C630134', 'status': 'Registered'},
            {'id': '936d20a1-b21c', 'name': 'R630134', 'status': 'Off-line'},
            {'id': '6c1e5f41-1fd7', 'name': 'T630134', 'status': 'Unregistered'},
            {'id': 'baebee3c-5532', 'name': 'U630134', 'status': 'Off-line'}
        )
        self.result_signal.emit(response)


class SearchResultBox(QGroupBox):

    def __init__(self, parent=None):

        super(SearchResultBox, self).__init__(parent)

        self.setTitle("&Search Result")

        self.result_table = QTableWidget(self)
        self.result_table.setColumnCount(3)
        self.result_table.setHorizontalHeaderLabels(["ID", "Name", "Status"])
        self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(self.result_table)

    @pyqtSlot(tuple)
    def objects_print(self):

        self.result_table.setRowCount(len(response))
        for num, row in enumerate(response):
            self.result_table.setItem(num, 0, QTableWidgetItem(row["id"]))
            self.result_table.setItem(num, 1, QTableWidgetItem(row["name"]))
            self.result_table.setItem(num, 2, QTableWidgetItem(row["status"]))

class MainApp(QMainWindow):

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

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.resize(800, 500)
        self.setWindowTitle("Device Search")

        self.main_app_build()

    def main_app_build(self):

        self.search = SearchBox("Device")
        self.result = SearchResultBox()

        layout = QGridLayout(self.centralWidget)
        layout.addWidget(self.search, 1, 0, 1, 1)
        layout.addWidget(self.result, 2, 0, 9, 1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainApp()
    ex.show()
    sys.exit(app.exec_())

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

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

Добавьте

self.search.result_signal.connect(self.result.objects_print) # +++

import sys
from PyQt5.QtCore import pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import (
    QApplication, QGridLayout, QMainWindow, QLineEdit, QLabel,\
    QTableWidget, QHeaderView, QWidget, QGroupBox, QHBoxLayout, \
    QPushButton, QTableWidgetItem
)

class SearchBox(QGroupBox):
    result_signal = pyqtSignal(tuple)

    def __init__(self, cucm_object: str, parent=None):
        super(SearchBox, self).__init__(parent)

        self.cucm_object = cucm_object

        self.setTitle(f"&Search {self.cucm_object}")

        self.search_line = QLineEdit()
        self.search_line.setFixedWidth(200)

        self.search_button = QPushButton("Search")
        self.search_button.clicked.connect(self.objects_search)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(self.search_line)
        h_layout.addWidget(self.search_button)
        h_layout.addStretch(1)

    @pyqtSlot()
    def objects_search(self):
        # response = some_script(self.search_line.text())
        response = (
            {'id': '09c6295d-9021', 'name': 'C630134', 'status': 'Registered'},
            {'id': '936d20a1-b21c', 'name': 'R630134', 'status': 'Off-line'},
            {'id': '6c1e5f41-1fd7', 'name': 'T630134', 'status': 'Unregistered'},
            {'id': 'baebee3c-5532', 'name': 'U630134', 'status': 'Off-line'}
        )
        self.result_signal.emit(response)


class SearchResultBox(QGroupBox):
    def __init__(self, parent=None):
        super(SearchResultBox, self).__init__(parent)

        self.setTitle("&Search Result")

        self.result_table = QTableWidget(self)
        self.result_table.setColumnCount(3)
        self.result_table.setHorizontalHeaderLabels(["ID", "Name", "Status"])
        self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(self.result_table)

    @pyqtSlot(tuple)
    def objects_print(self, response):
        self.result_table.setRowCount(len(response))
        for num, row in enumerate(response):
            self.result_table.setItem(num, 0, QTableWidgetItem(row["id"]))
            self.result_table.setItem(num, 1, QTableWidgetItem(row["name"]))
            self.result_table.setItem(num, 2, QTableWidgetItem(row["status"]))

class MainApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.resize(800, 500)
        self.setWindowTitle("Device Search")

        self.main_app_build()

    def main_app_build(self):
        self.search = SearchBox("Device")
        self.result = SearchResultBox()

        layout = QGridLayout(self.centralWidget)
        layout.addWidget(self.search, 1, 0, 1, 1)
        layout.addWidget(self.result, 2, 0, 9, 1)
        
        self.search.result_signal.connect(self.result.objects_print) # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainApp()
    ex.show()
    sys.exit(app.exec_())

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

→ Ссылка