PyQt6登录窗口Logo居中异常:窗口拉伸时Logo偏移
解决PyQt6中Logo稳定居中+右侧登录框固定边距的布局方案
问题根源
你之前的实现错误依赖手动调整QSpacerItem参数,没利用布局的拉伸权重(stretch)和容器尺寸策略,导致窗口拉伸时左侧空间分配失衡,Logo无法保持居中。
正确实现代码
from PyQt6.QtWidgets import (QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QPushButton, QSpacerItem, QSizePolicy) from PyQt6.QtCore import Qt from PyQt6.QtGui import QPixmap class LoginWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("登录界面") self.resize(1000, 700) # 初始尺寸可按需调整 # 中央主容器 central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QHBoxLayout(central_widget) # 设置右侧固定边距(控制登录框与窗口右侧的距离) main_layout.setContentsMargins(0, 0, 60, 0) main_layout.setSpacing(0) # ---------------------- 左侧Logo区域 ---------------------- left_container = QWidget() left_layout = QVBoxLayout(left_container) left_layout.setContentsMargins(0, 0, 0, 0) # 替换为你的Logo图片 logo_label = QLabel() logo_label.setPixmap(QPixmap("your_logo_path.png")) logo_label.setAlignment(Qt.AlignCenter) # 强制Logo在容器内居中 # 可选:让Logo按比例缩放,避免变形 logo_label.setScaledContents(True) logo_label.setFixedSize(200, 200) # 可固定Logo尺寸,也可去掉让它自适应 left_layout.addWidget(logo_label) # 让Logo在垂直方向也居中(适配窗口高度变化) left_layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) left_layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) # 关键:设置左侧容器占据所有剩余水平空间 main_layout.addWidget(left_container, stretch=1) # ---------------------- 右侧登录框区域 ---------------------- login_container = QWidget() login_container.setFixedWidth(320) # 固定登录框区域宽度 login_layout = QVBoxLayout(login_container) login_layout.setContentsMargins(20, 0, 20, 0) login_layout.setSpacing(15) # 登录控件 username_edit = QLineEdit() username_edit.setPlaceholderText("请输入用户名") username_edit.setFixedHeight(40) password_edit = QLineEdit() password_edit.setPlaceholderText("请输入密码") password_edit.setFixedHeight(40) password_edit.setEchoMode(QLineEdit.EchoMode.Password) login_btn = QPushButton("登录") login_btn.setFixedHeight(45) # 添加控件到登录布局 login_layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) login_layout.addWidget(username_edit) login_layout.addWidget(password_edit) login_layout.addWidget(login_btn) login_layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) main_layout.addWidget(login_container)
核心要点说明
- 主布局右侧边距:通过
main_layout.setContentsMargins(0, 0, 60, 0)直接设置登录框与窗口右侧的固定距离,无需额外spacer。 - 左侧容器拉伸权重:
main_layout.addWidget(left_container, stretch=1)让左侧容器占据窗口除右侧固定宽度区域外的所有空间,窗口拉伸时左侧区域同步放大,Logo在内部布局的强制居中下始终保持在左侧区域正中心。 - 右侧容器固定宽度:
login_container.setFixedWidth(320)确保登录框区域尺寸不随窗口拉伸变化,避免控件变形。 - 垂直居中适配:通过在Logo和登录框上下添加
QSpacerItem,实现控件在垂直方向的居中,适配不同窗口高度。
样式表适配(可选)
如果需要给控件添加样式,直接在代码中设置即可,示例:
self.setStyleSheet(""" QLineEdit { border: 1px solid #ccc; border-radius: 6px; padding: 0 10px; font-size: 14px; } QPushButton { background-color: #2563eb; color: white; border: none; border-radius: 6px; font-size: 16px; } QPushButton:hover { background-color: #1d4ed8; } """)
内容的提问来源于stack exchange,提问作者DigitalTemplar
相关产品推荐
相关产品推荐

