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_())
关键修正
- 新增提取副屏的全局起始坐标
screen_start_x和screen_start_y - 计算目标位置时,将副屏起始坐标与内部偏移量叠加,得到全局坐标系下的正确位置
- 显式调用
resize()设置窗口大小(如果你的App类没有默认设置窗口尺寸的话)
额外提醒:如果不确定副屏索引是否为1,可以先用a.desktop().screenCount()获取屏幕总数,遍历每个屏幕的screenGeometry(i)确认坐标,避免索引错误。
内容的提问来源于stack exchange,提问作者CKocar
相关产品推荐
相关产品推荐

