如何并排放置小部件
How to stick widgets side by side
下面的代码创建了一个对话框 window,其中包含三个小部件:QLabel、QComboBox 和 QButton。
我希望 QLabel 和 QComboBox 位于同一行。这就是为什么这两个小部件都分配给相同的水平布局。
调整对话框的大小会在 Label 和 ComboBox 之间创建一个巨大的空白 space。如何确保在调整对话框大小时 Combo 的左侧粘在 Label 的右侧?
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication([])
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
h_layout.addWidget(label)
h_layout.addWidget(combo)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
app.exec_()
您必须通过 QSizePolicy
建立大小策略,在您的情况下,您必须在 QComboBox
的水平组件中设置策略 QSizePolicy::Expanding
:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication(sys.argv)
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
policy = combo.sizePolicy()
policy.setHorizontalPolicy(QSizePolicy.Expanding)
combo.setSizePolicy(policy)
h_layout.addWidget(label)
h_layout.addWidget(combo)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
sys.exit(app.exec_())
更短更好的解决方案是将参数 stretch=1
添加到 addWidget() 函数:
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication([])
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
h_layout.addWidget(label)
h_layout.addWidget(combo, stretch=1)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
app.exec_()
下面的代码创建了一个对话框 window,其中包含三个小部件:QLabel、QComboBox 和 QButton。
我希望 QLabel 和 QComboBox 位于同一行。这就是为什么这两个小部件都分配给相同的水平布局。 调整对话框的大小会在 Label 和 ComboBox 之间创建一个巨大的空白 space。如何确保在调整对话框大小时 Combo 的左侧粘在 Label 的右侧?
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication([])
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
h_layout.addWidget(label)
h_layout.addWidget(combo)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
app.exec_()
您必须通过 QSizePolicy
建立大小策略,在您的情况下,您必须在 QComboBox
的水平组件中设置策略 QSizePolicy::Expanding
:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication(sys.argv)
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
policy = combo.sizePolicy()
policy.setHorizontalPolicy(QSizePolicy.Expanding)
combo.setSizePolicy(policy)
h_layout.addWidget(label)
h_layout.addWidget(combo)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
sys.exit(app.exec_())
更短更好的解决方案是将参数 stretch=1
添加到 addWidget() 函数:
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
app = QApplication([])
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setLayout(QVBoxLayout())
h_layout = QHBoxLayout()
self.layout().addLayout(h_layout)
label = QLabel(self)
label.setText('Month:')
combo = QComboBox(self)
h_layout.addWidget(label)
h_layout.addWidget(combo, stretch=1)
button = QPushButton('Ok')
self.layout().addWidget(button)
self.resize(200, 50)
self.show()
dialog = Dialog()
app.exec_()