我是PyQt5的新手,我正遇到有关QLayouts的问题...
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()
看起来像这样...
知道怎么做,每当我添加其他QLabel时,它们都会消失。
答案 0 :(得分:0)
在显示解决方案之前,您必须解释一些事情:
有3种方法可在小部件中设置布局:
创建没有父项的窗口小部件,然后该窗口小部件指示它使用setLayout()
使用该布局:
lay = QVBoxLayout()
foo_widget.setLayout(lay)
指向构建布局时要管理的窗口小部件。
lay = QVBoxLayout(foo_widget)
以前的方法是等效的,但是第三个方法是将其建立为已经建立的布局的儿子。
窗口小部件只能具有顶层布局,因此,如果仅保留最后一个布局:
lay1 = QVBoxLayout(foo_widget)
lay2 = QVBoxLayout(foo_widget)
# The above is equivalent to:
lay1 = QVBoxLayout()
lay2 = QVBoxLayout(foo_widget)
一个小部件是另一个小部件的儿子,当它在构造函数中被设置为父级时,或者被建立为处理小部件位置的布局的一部分:
1。
child_1 = Foo_Widget(some_widget)
2。
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
正如您所看到的,这是预期的,例如,由于所有标签最初都是在没有布局的情况下建立的,所以在所有内容的后面都显示了2个标签,然后在放置QScrollArea
的位置建立了布局,因此最后一个占据了所有可用空间,最后放置了没有布局的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()