Как организовать взаимодействие двух виджетов через третий класс

Рейтинг: 1Ответов: 1Опубликовано: 29.01.2023

Есть два экземпляра 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_())

Вопрос такой, как правильно написать код?

Ответы

▲ 0Принят

Это результат работы вашего кода:

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

Обратите внимание сколько итемов в 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_())

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