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)
# ...
我正在实现自己的标签,但是一些小部件消失了。
我的代码是:
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)
# ...