pyqt5:一些小部件在我的标签中消失了

pyqt5: some widgets are disappear in my label

我正在实现自己的标签,但是一些小部件消失了。

我的代码是:



from PyQt5.QtWidgets import *
import sys


class TypeManagerLabel(QLabel):


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

        layout = QVBoxLayout()
        self.setLayout(layout)

        btnLayout = QHBoxLayout()
        self.__nameLineEdit = QLineEdit()
        self.__opBtn = QPushButton('Add/Remove')
        self.__colorBtn = QPushButton('Color')
        btnLayout.addWidget(self.__nameLineEdit)
        btnLayout.addWidget(self.__opBtn)
        layout.addLayout(btnLayout)


class MyWin(QLabel):

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

        layout = QVBoxLayout()
        self.setLayout(layout)

        lab1 = TypeManagerLabel()
        layout.addWidget(lab1)
        # layout.addStretch()
        lab2 = QPushButton('test')
        layout.addWidget(lab2)

app = QApplication(sys.argv)
dialog = MyWin()
dialog.show()
app.exec_()

目前标签没问题,结果应该是:

现在,我希望 QLineEdit 位于标签的顶部,因此我添加了一个拉伸。代码是:

class MyWin(QLabel):

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

        layout = QVBoxLayout()
        self.setLayout(layout)

        lab1 = TypeManagerLabel()
        layout.addWidget(lab1)
        layout.addStretch()  ###################### add the stretch
        lab2 = QPushButton('test')
        layout.addWidget(lab2)

结果是:

上图中QLineEdit消失了

@

我的环境是:

win 10
python 3.7.8
pyqt5 5.14.0

--------------------------------更新------------ ----------------------

感谢 musicamante 和 Heike 的建议,继承 QWidget 而不是 QLabel。但是在我添加了一些新的小部件后报告了新的错误。代码是:



from PyQt5.QtWidgets import *
import sys


class TypeManagerLabel(QWidget):

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

        layout = QVBoxLayout()
        self.setLayout(layout)

        btnLayout = QHBoxLayout()
        self.__nameLineEdit = QLineEdit()
        self.__opBtn = QPushButton('Add')
        btnLayout.addWidget(self.__nameLineEdit)
        btnLayout.addWidget(self.__opBtn)

        layout.addLayout(btnLayout)

        infoLabel = QLabel()
        layout.addWidget(infoLabel)

        self.__infoLayout = QVBoxLayout()
        infoLabel.setLayout(self.__infoLayout)

        self.__opBtn.clicked.connect(self.addRemoveSlot)


    def addRemoveSlot(self, checked=False):

        name = self.__nameLineEdit.text()
        layout = QHBoxLayout()
        checkBox = QCheckBox()
        lineEdit = QLineEdit(name)
        layout.addWidget(checkBox)
        layout.addWidget(lineEdit)
        self.__infoLayout.addLayout(layout)


class MyWin(QLabel):

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

        layout = QVBoxLayout()
        self.setLayout(layout)

        lab1 = TypeManagerLabel()
        layout.addWidget(lab1)
        # layout.addStretch()
        lab2 = QPushButton('test')
        layout.addWidget(lab2)

app = QApplication(sys.argv)
dialog = MyWin()
dialog.show()
app.exec_()

当我在QLineEdit中输入一个字符串,然后点击“添加”按钮,结果是:

上图是我预想的

但是如果我用代码添加拉伸:

class MyWin(QLabel):

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

        layout = QVBoxLayout()
        self.setLayout(layout)

        lab1 = TypeManagerLabel()
        layout.addWidget(lab1)
        layout.addStretch() ###################### add the stretch
        lab2 = QPushButton('test')
        layout.addWidget(lab2)

然后,如果我在 QLineEdit 中输入一个字符串并单击 'Add' 按钮,预期的小部件将不会出现。

QLabel 是一种非常特殊的小部件。虽然它看起来很简单,但它 不是 :它在处理尺寸时有自己的行为,这是为了满足主要基于(可能)可变文本的小部件的所有要求大小,不仅横向,纵向也一样。

也就是说,永远不要尝试向 classes 添加不打算用作容器的布局和子窗口小部件,最重要的是它应该 而不是 在 QLabel 等具有特殊行为的小部件上完成。
使用这样的小部件来包含其他小部件不仅是一个 非常糟糕的主意 ,而且完全没有用,因为您实际上并没有使用 QLabel 提供的真实功能(显示文本或图像) .

要添加子项和布局,只需使用嵌套布局、普通 QWidget class 或任何其他容器小部件,如 QGroupBox 或 QFrame。

即使在评论之后,您仍在尝试将小部件添加到 QLabel。删除该标签,并将布局添加到主标签中。

class TypeManagerLabel(QWidget):
    def __init__(self):
        super().__init__()
        # ...

        layout.addLayout(btnLayout)

        self.__infoLayout = QVBoxLayout()
        <b>layout.addLayout(self.__infoLayout)</b>

        self.__opBtn.clicked.connect(self.addRemoveSlot)

    # ...