如何并排放置小部件

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_()