为什么我的标签在我的 QHBoxLayout 中堆叠在一起?
Why are my labels stacking on top of each other inside my QHBoxLayout?
很简单,我想使用 Python 的 PYQT5 在水平框布局内添加两个标签。
当我执行这段代码时,这两个标签出现在彼此的顶部,即使将它们添加到 QHBoxLayout 应该从左到右放置它们。
我该如何解决这个问题?
- 编译器:Python 3.7.4 32 位
- IDE : Visual Studio 代码
- OS : Windows 10
我的代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Interface(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'debug'
self.mainLayout = QHBoxLayout()
self.initGUI()
def initGUI(self):
self.setGeometry(0,0,200,200)
self.setFixedSize(self.size())
self.setWindowTitle(self.title)
label1 = QLabel('test 1',self)
label2 = QLabel('test 2',self)
self.mainLayout.addWidget(label1)
self.mainLayout.addWidget(label2)
self.setLayout(self.mainLayout)
self.show()
def close_application(self):
sys.exit()
if __name__ == '__main__':
app = QApplication([])
window = Interface()
sys.exit(app.exec_())
解释:
QMainWindow 是一个具有默认布局的特殊小部件:
不允许建立另一个布局并清楚地指示在 terminal/CMD 中执行代码时获得的错误消息:
QWidget::setLayout: Attempting to set QLayout "" on Interface "", which already has a layout
所以当布局未建立时,它不处理QLabels的位置,而你作为父级传递给window-self
时,两者都将设置在window 在左上角的位置。
解决方案:
正如the docs指出的,您必须创建一个用作容器的中央小部件,然后设置布局:
def initGUI(self):
self.setGeometry(0,0,200,200)
self.setFixedSize(self.size())
self.setWindowTitle(self.title)
central_widget = QWidget() # <---
self.setCentralWidget(central_widget) # <---
label1 = QLabel('test 1')
label2 = QLabel('test 2')
self.mainLayout.addWidget(label1)
self.mainLayout.addWidget(label2)
central_widget.setLayout(self.mainLayout) # <---
self.show()
很简单,我想使用 Python 的 PYQT5 在水平框布局内添加两个标签。
当我执行这段代码时,这两个标签出现在彼此的顶部,即使将它们添加到 QHBoxLayout 应该从左到右放置它们。
我该如何解决这个问题?
- 编译器:Python 3.7.4 32 位
- IDE : Visual Studio 代码
- OS : Windows 10
我的代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Interface(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'debug'
self.mainLayout = QHBoxLayout()
self.initGUI()
def initGUI(self):
self.setGeometry(0,0,200,200)
self.setFixedSize(self.size())
self.setWindowTitle(self.title)
label1 = QLabel('test 1',self)
label2 = QLabel('test 2',self)
self.mainLayout.addWidget(label1)
self.mainLayout.addWidget(label2)
self.setLayout(self.mainLayout)
self.show()
def close_application(self):
sys.exit()
if __name__ == '__main__':
app = QApplication([])
window = Interface()
sys.exit(app.exec_())
解释:
QMainWindow 是一个具有默认布局的特殊小部件:
不允许建立另一个布局并清楚地指示在 terminal/CMD 中执行代码时获得的错误消息:
QWidget::setLayout: Attempting to set QLayout "" on Interface "", which already has a layout
所以当布局未建立时,它不处理QLabels的位置,而你作为父级传递给window-self
时,两者都将设置在window 在左上角的位置。
解决方案:
正如the docs指出的,您必须创建一个用作容器的中央小部件,然后设置布局:
def initGUI(self):
self.setGeometry(0,0,200,200)
self.setFixedSize(self.size())
self.setWindowTitle(self.title)
central_widget = QWidget() # <---
self.setCentralWidget(central_widget) # <---
label1 = QLabel('test 1')
label2 = QLabel('test 2')
self.mainLayout.addWidget(label1)
self.mainLayout.addWidget(label2)
central_widget.setLayout(self.mainLayout) # <---
self.show()