Как организовать взаимодействие двух виджетов через третий класс
Есть два экземпляра QComboBox в разных классах. Необходимо, чтобы при выборе значения из одного комбобокса, такое значение появлялось в другом комбобоксе.
Взаимодействие комбобоксов должно происходить через изменения атрибутов третьего класса.
Я написал такой код. Вроде работает как надо, но мне кажется код некорректный.
from PyQt5.QtWidgets import *
import sys
class A:
a = ""
def get_a():
return A.a
def set_a(s):
A.a = s
B.comboBox.addItem(A.get_a())
class B(QGroupBox):
def __init__(self):
super().__init__("Получить значение")
self.initUI()
def initUI(self):
B.comboBox = QComboBox()
self.vBox = QVBoxLayout()
self.vBox.addWidget(self.comboBox)
self.setLayout(self.vBox)
class C(QGroupBox):
def __init__(self):
super().__init__("Выбрать значение:")
self.initUI()
def initUI(self):
self.comboBox = QComboBox()
for i in ["1","2","3"]:
self.comboBox.addItem(i)
self.comboBox.activated[str].connect(A.set_a)
self.vBox = QVBoxLayout()
self.vBox.addWidget(self.comboBox)
self.setLayout(self.vBox)
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Example")
window.resize(200, 200)
b = B()
c = C()
layout = QVBoxLayout()
layout.addWidget(c)
layout.addWidget(b)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
Вопрос такой, как правильно написать код?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Это результат работы вашего кода:
Обратите внимание сколько итемов в comboBox, который принимает значения.
Я не понимаю зачем вам класс А() ?
Попробуйте так:
import sys
from PyQt5.Qt import *
class B(QGroupBox):
def __init__(self):
super().__init__("Получить значение")
self.initUI()
def initUI(self):
self.comboBox = QComboBox()
self.vBox = QVBoxLayout(self)
self.vBox.addWidget(self.comboBox)
class C(QGroupBox):
def __init__(self):
super().__init__("Выбрать значение:")
self.initUI()
def initUI(self):
self.comboBox = QComboBox()
self.comboBox.addItems(["1", "Два", "3"]) # ! addItems
self.vBox = QVBoxLayout(self)
self.vBox.addWidget(self.comboBox)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.b = B()
self.c = C()
self.c.comboBox.activated[str].connect(self.set_item_b)
layout = QVBoxLayout(self)
layout.addWidget(self.c)
layout.addWidget(self.b)
def set_item_b(self, text):
index = self.b.comboBox.findText(text)
if index == -1:
self.b.comboBox.addItem(text)
index = self.b.comboBox.count() - 1
self.b.comboBox.setCurrentIndex(index)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle("Example")
window.resize(200, 200)
window.show()
sys.exit(app.exec_())

