You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

核心要点说明

  1. 主布局右侧边距:通过main_layout.setContentsMargins(0, 0, 60, 0)直接设置登录框与窗口右侧的固定距离,无需额外spacer。
  2. 左侧容器拉伸权重:main_layout.addWidget(left_container, stretch=1)让左侧容器占据窗口除右侧固定宽度区域外的所有空间,窗口拉伸时左侧区域同步放大,Logo在内部布局的强制居中下始终保持在左侧区域正中心。
  3. 右侧容器固定宽度:login_container.setFixedWidth(320)确保登录框区域尺寸不随窗口拉伸变化,避免控件变形。
  4. 垂直居中适配:通过在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:42:33