Python 将小部件添加到Vbox布局时的大小调整问题
我正在处理QLayouts的问题Python 将小部件添加到Vbox布局时的大小调整问题,python,python-3.x,pyqt,pyqt5,qlayout,Python,Python 3.x,Pyqt,Pyqt5,Qlayout,我正在处理QLayouts的问题 class welcomeWidget(QWidget): def __init__(self): super().__init__() self.initText() self.organize() def initText(self): self.welcome = QLabel("Welcome to Name!", self) self.
class welcomeWidget(QWidget):
def __init__(self):
super().__init__()
self.initText()
self.organize()
def initText(self):
self.welcome = QLabel("Welcome to Name!", self)
self.info = QLabel("This program allows you to....", self)
self.message = QLabel("First, you must enter some data...", self)
self.proceed = QLabel("Click on 'Next >>' to proceed.", self)
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea(self)
vbox.addWidget(scroll)
wid = QWidget(self)
vevobox = QVBoxLayout(wid)
vv = QVBoxLayout()
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vevobox.addLayout(vv)
self.show()
看起来像这样。。。
Idk如何操作,每当我添加其他QLabel时,它们都会消失。在显示解决方案之前,您必须解释一些事情:
- 有3种方法可以在小部件中设置布局:
- 创建没有父级的小部件,然后小部件指示它使用带有
的布局:setLayout()
- 指向构建布局时要管理的小部件
lay = QVBoxLayout(foo_widget)
- 前面的方法是等效的,但第三种方法是将其建立为已建立布局的子对象
- 小部件只能具有顶层布局,因此如果只剩下最后一个布局:
lay1 = QVBoxLayout(foo_widget) lay2 = QVBoxLayout(foo_widget) # The above is equivalent to: lay1 = QVBoxLayout() lay2 = QVBoxLayout(foo_widget)
- 当一个小部件被设置为构造器中的父部件,或者作为处理小部件位置的布局的一部分建立时,它是另一个小部件的子部件:
1.
2.child_1 = Foo_Widget(some_widget)
lay = Foo_Layout(some_widget) child_2 = Foo_Widget() lay.addWidget(child_2)
如果你考虑上面的内容,你可以减少代码:
...
def initText(self):
self.welcome = QLabel("Welcome to Name!")
self.info = QLabel("This program allows you to....")
self.message = QLabel("First, you must enter some data...", self)
self.proceed = QLabel("Click on 'Next >>' to proceed.", self)
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea()
vbox.addWidget(scroll)
wid = QWidget(self)
vevobox = QVBoxLayout(wid)
vv = QVBoxLayout()
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vevobox.addLayout(vv)
self.show()
使用上述方法,可以组装以下树:
welcomeWidget
├── message
├── proceed
├── vbox (QVBoxLayout)
│ └── scroll
└── wid
└── vevobox (QVBoxLayout)
└──vv (QVBoxLayout)
├── info
└── welcome
正如您所看到的,例如,有两个标签显示在所有东西的后面,因为它们最初是在没有布局的情况下建立的,然后在放置qscrollara
的位置建立了布局,所以最后一个标签占用了所有可用空间,最后,不带布局的wid小部件被放置在左上角,在该小部件中建立了剩余的2个标签
其想法是具有以下结构:
welcomeWidget
└── vbox (QVBoxLayout)
└── scroll
└── wid
└── vv (QVBoxLayout)
├── info
├── message
├── proceed
└── welcome
使用上述方法,您可以得到以下结果:
class welcomeWidget(QWidget):
def __init__(self):
super().__init__()
self.initText()
self.organize()
def initText(self):
self.welcome = QLabel("Welcome to Name!")
self.info = QLabel("This program allows you to....")
self.message = QLabel("First, you must enter some data...")
self.proceed = QLabel("Click on 'Next >>' to proceed.")
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
wid = QWidget()
scroll.setWidget(wid)
vv = QVBoxLayout(wid)
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vv.addWidget(self.message)
vv.addWidget(self.proceed)
vv.addStretch()
vbox.addWidget(scroll)
self.show()
class welcomeWidget(QWidget):
def __init__(self):
super().__init__()
self.initText()
self.organize()
def initText(self):
self.welcome = QLabel("Welcome to Name!")
self.info = QLabel("This program allows you to....")
self.message = QLabel("First, you must enter some data...")
self.proceed = QLabel("Click on 'Next >>' to proceed.")
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
wid = QWidget()
scroll.setWidget(wid)
vv = QVBoxLayout(wid)
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vv.addWidget(self.message)
vv.addWidget(self.proceed)
vv.addStretch()
vbox.addWidget(scroll)
self.show()