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