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

PyQt5窗口无法在副屏打开问题:已获副屏分辨率仍显示主屏

问题原因与修复方法

你的代码之所以窗口仍显示在主屏,核心问题是没用到副屏的全局坐标原点。screenGeometry(1)返回的副屏区域本身包含它在整个桌面坐标系中的起始位置(比如主屏是1920×1080时,副屏的x起始坐标可能就是1920),但你只计算了副屏内部的相对偏移,没叠加这个起始坐标,导致窗口被移到了主屏的(0,0)位置。

具体错误点

  • 你把window_width和window_height直接设为副屏的宽高,导致(screen_resolution.width() - window_width)结果为0,x、y最终都算成0
  • move(x,y)使用的是桌面全局坐标,(0,0)对应主屏左上角,窗口自然出现在主屏

修复后的代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("副屏显示窗口")

if __name__ == "__main__":
    a = QApplication(sys.argv)
    w = App()

    # 获取副屏的完整几何信息(包含全局起始坐标)
    secondary_screen = a.desktop().screenGeometry(1)
    # 提取副屏的全局起始x、y坐标
    screen_start_x = secondary_screen.x()
    screen_start_y = secondary_screen.y()
    # 自定义窗口大小,这里用副屏尺寸示例,也可改成需要的大小
    win_w = secondary_screen.width()
    win_h = secondary_screen.height()
    # 计算窗口在副屏内的居中位置(转换为全局坐标)
    target_x = screen_start_x + (secondary_screen.width() - win_w) // 2
    target_y = screen_start_y + (secondary_screen.height() - win_h) // 2

    w.resize(win_w, win_h)
    w.move(target_x, target_y)
    w.show()
    sys.exit(a.exec_())

关键修正

  1. 新增提取副屏的全局起始坐标screen_start_x和screen_start_y
  2. 计算目标位置时,将副屏起始坐标与内部偏移量叠加,得到全局坐标系下的正确位置
  3. 显式调用resize()设置窗口大小(如果你的App类没有默认设置窗口尺寸的话)

额外提醒:如果不确定副屏索引是否为1,可以先用a.desktop().screenCount()获取屏幕总数,遍历每个屏幕的screenGeometry(i)确认坐标,避免索引错误。

内容的提问来源于stack exchange,提问作者CKocar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:50:35