QMainWindow 和子部件大小不匹配
QMainWindow and child widgets size don't match
可能是一个新手问题,但我仍在学习 PySide。所以我正在尝试使用具有 QFrame 的 QMainWindow 并且 QFrame 具有两个标签。我在 QMainWindow 和 QFrame 上使用 QBoxLayouts。问题是,当我将 QFrame 设置为 200x200 之类的值时,QMainWindow 不会调整大小,它仍然太小而无法显示两个标签。如果我错了请纠正我,但 QMainWindow 在使用布局时不应该自动具有正确的大小吗?另外,当我输出 frame.sizeHint() 然后它输出 PySide.QtCore.QSize(97, 50)
但我希望它是 200, 200.
下面的代码将重现问题:
import sys
from PySide import QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
def initUI(self):
#-------
#CREATE WIDGETS
#-------
frame = QtGui.QFrame()
frame.setStyleSheet("QFrame {background-color: yellow}")
frame.setGeometry(0, 0, 200, 200)
someLabel = QtGui.QLabel("SomeLabel")
someOtherLabel = QtGui.QLabel("SomeOtherLabel")
self.setCentralWidget(frame)
#--------
#CREATE LAYOUT
#--------
frameLayout = QtGui.QVBoxLayout()
frameLayout.addWidget(someLabel)
frameLayout.addWidget(someOtherLabel)
frame.setLayout(frameLayout)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(frame)
self.setLayout(mainLayout)
self.show()
def main():
app = QtGui.QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这是代码 运行:
之后发生的事情
一个QMainWindow
已经有一个顶层布局,所以你不应该自己设置一个。您需要做的就是设置中央小部件,然后为其添加布局和小部件。
因此,您的示例可以这样修正:
frame.setLayout(frameLayout)
# get rid of these three lines
# mainLayout = QtGui.QVBoxLayout()
# mainLayout.addWidget(frame)
# self.setLayout(mainLayout)
self.show()
值得注意的是,PySide 中可能有关于此的 bug/misfeature,因为在 PyQt 中,您的原始脚本会打印一条有用的错误消息:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
可能是一个新手问题,但我仍在学习 PySide。所以我正在尝试使用具有 QFrame 的 QMainWindow 并且 QFrame 具有两个标签。我在 QMainWindow 和 QFrame 上使用 QBoxLayouts。问题是,当我将 QFrame 设置为 200x200 之类的值时,QMainWindow 不会调整大小,它仍然太小而无法显示两个标签。如果我错了请纠正我,但 QMainWindow 在使用布局时不应该自动具有正确的大小吗?另外,当我输出 frame.sizeHint() 然后它输出 PySide.QtCore.QSize(97, 50)
但我希望它是 200, 200.
下面的代码将重现问题:
import sys
from PySide import QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
def initUI(self):
#-------
#CREATE WIDGETS
#-------
frame = QtGui.QFrame()
frame.setStyleSheet("QFrame {background-color: yellow}")
frame.setGeometry(0, 0, 200, 200)
someLabel = QtGui.QLabel("SomeLabel")
someOtherLabel = QtGui.QLabel("SomeOtherLabel")
self.setCentralWidget(frame)
#--------
#CREATE LAYOUT
#--------
frameLayout = QtGui.QVBoxLayout()
frameLayout.addWidget(someLabel)
frameLayout.addWidget(someOtherLabel)
frame.setLayout(frameLayout)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(frame)
self.setLayout(mainLayout)
self.show()
def main():
app = QtGui.QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这是代码 运行:
之后发生的事情一个QMainWindow
已经有一个顶层布局,所以你不应该自己设置一个。您需要做的就是设置中央小部件,然后为其添加布局和小部件。
因此,您的示例可以这样修正:
frame.setLayout(frameLayout)
# get rid of these three lines
# mainLayout = QtGui.QVBoxLayout()
# mainLayout.addWidget(frame)
# self.setLayout(mainLayout)
self.show()
值得注意的是,PySide 中可能有关于此的 bug/misfeature,因为在 PyQt 中,您的原始脚本会打印一条有用的错误消息:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout