Pyqt Добавить один и тот же объект виджета в разных макетах - PullRequest
0 голосов
/ 15 января 2020

Теперь я хочу использовать Pyqt для разработки такого набора логик c, добавить два разных виджета в двух макетах, эти два разных виджета используют один и тот же виджет, потому что я хочу поделиться данными одного и того же виджета в разных макеты Но, к сожалению, мой дизайн не удался, в случае, я не могу показать два PYQT на дисплее, кто-нибудь может мне помочь


from PyQt4.QtGui import *
from PyQt4.QtCore import *


class Series(QWidget):
    def __init__(self):
        super(Series, self).__init__()
        self.lb = QLabel('PYQT')


class SeriesHBox1(QWidget):
    def __init__(self, series):
        super(SeriesHBox1, self).__init__()
        self.vbox = QVBoxLayout()
        self.setLayout(self.vbox)
        self.vbox.addWidget(series.lb)


class SeriesHBox2(QWidget):
    def __init__(self, series):
        super(SeriesHBox2, self).__init__()
        self.hbox = QHBoxLayout()
        self.setLayout(self.hbox)
        self.hbox.addWidget(series.lb)


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 500, 300)
        box = QHBoxLayout()
        self.setLayout(box)

        box1 = QHBoxLayout()
        box2 = QHBoxLayout()
        box.addLayout(box1)
        box.addLayout(box2)

        series = Series()
        box1.addWidget(SeriesHBox1(series))
        box2.addWidget(SeriesHBox2(series))
        # box2.addWidget(SeriesHBox2(Series()))

        self.show()


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

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Это ответ, который я хочу


from PyQt4.QtGui import *
from PyQt4.QtCore import *


class Series(QWidget):
    def __init__(self, parent=None):
        super(Series, self).__init__(parent)
        self.lb = QLabel('PYQT')


class SeriesHBox1(QWidget):
    def __init__(self, series):
        super(SeriesHBox1, self).__init__()
        self.vbox = QVBoxLayout()
        self.setLayout(self.vbox)
        self.vbox.addWidget(series.lb)


class SeriesHBox2(QWidget):
    def __init__(self, series):
        super(SeriesHBox2, self).__init__()
        self.hbox = QHBoxLayout()
        self.setLayout(self.hbox)
        self.hbox.addWidget(series.lb)


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 500, 300)
        box = QHBoxLayout()
        self.setLayout(box)

        box1 = QHBoxLayout()
        box2 = QHBoxLayout()
        box.addLayout(box1)
        box.addLayout(box2)
        s = Series()
        h = SeriesHBox1(s)
        s.__init__(h)
        print(s)
        box1.addWidget(h)
        b = SeriesHBox2(s)
        s.__init__(b)
        print(s)
        box2.addWidget(b)

        c = QPushButton()
        c.clicked.connect(self.close_a)

        d = QPushButton()
        d.clicked.connect(self.close_b)

        box.addWidget(c)
        box.addWidget(d)
        self.show()

    def close_a(self):
        self.a.hide()

    def close_b(self):
        self.b.hide()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
0 голосов
/ 15 января 2020

Виджет не может быть в двух разных виджетах одновременно. Итак, вам нужно создать два Series экземпляра (по одному для каждого SeriesHBox).

Самый простой способ поделиться данными (скажем, содержимым вашего ярлыка) - это извлечь состояние (текст ) в другом объекте, который будет использоваться экземпляром Series и будет обновлять их при изменении содержимого.

Быстрый пример:

class SeriesModel(QObject):
    def __init__(self, parent=None):
        super(SeriesModel, self).__init__(parent)
        self._content = "PYQT"

    contentChanged = pyqtSignal(str)

    @pyqtProperty(str, notify=contentChanged)
    def content(self):
        return self._content

    @content.setter
    def content(self, value):
        self._content = value

class Series(QWidget):
    def __init__(self, model):
        super(Series, self).__init__()
        self.model = model
        self.lb = QLabel(model.content)

        self.model.contentChanged.connect(self.lb.setText)



class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 500, 300)
        box = QHBoxLayout()
        self.setLayout(box)

        box1 = QHBoxLayout()
        box2 = QHBoxLayout()
        box.addLayout(box1)
        box.addLayout(box2)


        model = SeriesModel(self)

        series1 = Series(model)
        series2 = Series(model)

        box1.addWidget(SeriesHBox1(series1))
        box2.addWidget(SeriesHBox2(series2))

        self.show()

Если вы измените содержимое в SeriesModel Также будут обновлены две метки.

0 голосов
/ 15 января 2020

Извините, у меня есть PyQt5. Создайте два экземпляра класса Series

#from PyQt4.QtGui import *
#from PyQt4.QtCore import *
from PyQt5.Qt import *
import random


class Series(QWidget):
    def __init__(self):
        super(Series, self).__init__()
        self.lb = QLabel('PYQT')
        self.lb.setStyleSheet("""background-color: {};""".format(
            QColor(*random.sample(range(255), 3)).name()
        )
    )


class SeriesHBox1(QWidget):
    def __init__(self, series):
        super(SeriesHBox1, self).__init__()
        self.vbox = QVBoxLayout()
        self.setLayout(self.vbox)
        self.vbox.addWidget(series.lb)


class SeriesHBox2(QWidget):
    def __init__(self, series):
        super(SeriesHBox2, self).__init__()
        self.hbox = QHBoxLayout()
        self.setLayout(self.hbox)
        self.hbox.addWidget(series.lb)


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

    def initUI(self):
        self.setGeometry(300, 300, 500, 300)
        box = QHBoxLayout()
        self.setLayout(box)

        box1 = QHBoxLayout()
        box2 = QHBoxLayout()
        box.addLayout(box1)
        box.addLayout(box2)

#        series = Series()
        series1 = Series()                                # +
        series2 = Series()                                # +

        box1.addWidget(SeriesHBox1(series1))
        box2.addWidget(SeriesHBox2(series2))
        # box2.addWidget(SeriesHBox2(Series()))


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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...