Общий атрибут между двумя классами «QWidget»

#python #python-3.x #pyside2

#python #python-3.x #pyside2

Вопрос:

Я пытаюсь «отправить» атрибут из класса QWidget в другой.

В приведенном ниже примере я пытаюсь установить текст QLineEdit «self.edit», принадлежащий классу «Widget1», в качестве текста QLabel «self.метка» принадлежность к классу «Widget2».

Эта попытка предпринята в функции «setLabel». Часть, которую я не могу понять, — это «Widget2.label.setText (текст)»

Наличие класса в классе в функции… Я немного запутался, как этого добиться…

 import sys
from PySide2.QtWidgets import (QApplication, QHBoxLayout, QVBoxLayout, QWidget, QPushButton, QLabel, QLineEdit)

class Main_UI(QWidget):

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

    def initUI(self):
        layout = QVBoxLayout()
        widget1 = Widget1()
        widget2 = Widget2()
        layout.addWidget(widget1)
        layout.addWidget(widget2)
        self.setLayout(layout)
        self.show()

class Widget1(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QHBoxLayout()
        self.edit = QLineEdit("")
        button = QPushButton("Set value")
        button.clicked.connect(self.setLabel)
        layout.addWidget(self.edit)
        layout.addWidget(button)
        self.setLayout(layout)
    
    def setLabel(self):
        text = self.edit.text()
        Widget2.label.setText(text)

class Widget2(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QHBoxLayout()
        self.label = QLabel("")
        layout.addWidget(self.label)
        self.setLayout(layout)

def main():
    app = QApplication(sys.argv)
    ex = Main_UI()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
  

Любая помощь будет оценена, и если мой пример или объяснения не понятны, я предоставлю дополнительные пояснения.

Ответ №1:

Вы можете сделать это с помощью пользовательского сигнала.

 import sys
from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QVBoxLayout, QWidget, QPushButton, QLabel, QLineEdit)
from PyQt5 import QtCore


class Main_UI(QWidget):
    def __init__(self, parent=None):
        super(Main_UI, self).__init__(parent)
        self.initUI()
    
    def initUI(self):
        layout = QVBoxLayout()
        widget1 = Widget1()
        widget2 = Widget2()
        layout.addWidget(widget1)
        layout.addWidget(widget2)
        self.setLayout(layout)
        
        widget1.button_signal.connect(widget2.label.setText)  # Connecting the label to the custom signal.
        
        self.show()


class Widget1(QWidget):
    button_signal = QtCore.pyqtSignal(str)  # Creating a signal.
    
    def __init__(self, parent=None):
        super(Widget1, self).__init__(parent)
        self.initUI()
    
    def initUI(self):
        layout = QHBoxLayout()
        self.edit = QLineEdit("")
        button = QPushButton("Set value")
        button.clicked.connect(self.setLabel)
        layout.addWidget(self.edit)
        layout.addWidget(button)
        self.setLayout(layout)
    
    def setLabel(self):
        """Emit button signal with text.
        
        This could have been solved with a lambda.
        
        """        
        self.button_signal.emit(self.edit.text())  # Emitting Signal.


class Widget2(QWidget):
    def __init__(self, parent=None):
        super(Widget2, self).__init__(parent)
        self.initUI()
    
    def initUI(self):
        layout = QHBoxLayout()
        self.label = QLabel("")
        layout.addWidget(self.label)
        self.setLayout(layout)


def main():
    app = QApplication(sys.argv)
    ex = Main_UI()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
  

Документы: https://doc.qt.io/qt-5/signalsandslots.html

Комментарии:

1. Я адаптировал ваш код к своему, и он работает как шарм! Спасибо более 9000!

2. Просто примечание: с PySide2 это QtCore.Signal(str)

3. Извините за это. Это одна из тех раздражающих вещей, когда вы работаете как с PyQt5, так и с PySide2.