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

PyQt如何在不重写全文件的前提下打开同风格第二个窗口

Qt多窗口同样式不同内容实现方案

问题背景

你当前的代码把QApplication实例和程序退出逻辑都塞进了overviewWindow类里,导致无法正常打开第二个窗口。参考的示例是把应用初始化放在单独的main函数中,窗口类继承Qt的控件类,这种结构能轻松实现多窗口。下面是不用重写整个文件的修改步骤:


第一步:重构主窗口类

把overviewWindow改成继承QWidget,移除内部的QApplication初始化和sys.exit,让它变成纯粹的窗口控件:

class overviewWindow(QWidget):  # 继承QWidget,符合Qt控件规范
    def __init__(self):
        super().__init__()  # 调用父类构造方法
        # 数据库连接逻辑保留
        conn = None
        try:
            conn = sqlite3.connect("exercises.db")
            print("[*] Connected successfully to the database")
        except: 
            print("[*] Error connecting to the databse")

        # 窗口通用样式设置(和第二个窗口共用)
        self.resize(winWidth, winHeight)
        self.move(200, 20)
        self.setWindowTitle("Test")
        self.setStyleSheet("background-color: #F4F0BB")
        
        self.showUI()

    # 原showUI方法保留,仅调整控件父类传递方式
    def showUI(self):
        # 标题控件
        self.title = QLabel(self)  # 直接传入父控件,替代setParent
        self.title.setText("Overblik")
        self.title.resize(winWidth, 100)
        self.title.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.title.setStyleSheet("font-size: 45pt")

        self.frame = QFrame(self)
        self.frame.resize(winWidth, 900)
        self.frame.move(0, 100)

        # 按钮生成逻辑保留,新增点击打开第二个窗口的事件
        xBuffer = 130
        yBuffer = 130
        sum = 0
        for i in range(0, 6):
            for j in range(0, 4):
                sum += 1
                self.button2 = Button(self.frame, 75+(j*xBuffer), 75+(i*yBuffer), str(sum))
                self.button2.clicked.connect(self.open_second_window)

    # 新增打开第二个窗口的方法
    def open_second_window(self):
        self.second_win = secondWindow()
        self.second_win.show()

第二步:实现第二个窗口类

让secondWindow同样继承QWidget,复用主窗口的尺寸、背景样式,再自定义专属UI内容:

class secondWindow(QWidget):
    def __init__(self):
        super().__init__()
        # 复用主窗口的通用样式设置
        self.resize(winWidth, winHeight)
        self.move(200, 20)
        self.setWindowTitle("第二个窗口")
        self.setStyleSheet("background-color: #F4F0BB")
        
        self.show_custom_ui()

    def show_custom_ui(self):
        # 自定义第二个窗口的内容,示例:不同的标题和返回按钮
        self.title = QLabel("第二个窗口专属内容", self)
        self.title.resize(winWidth, 100)
        self.title.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.title.setStyleSheet("font-size: 45pt; color: #FF5733")

        self.back_btn = QPushButton("返回主窗口", self)
        self.back_btn.resize(200, 50)
        self.back_btn.move(winWidth//2 - 100, winHeight//2)
        self.back_btn.clicked.connect(self.close)

第三步:添加main函数入口

把应用初始化和程序启动逻辑移到这里,和参考示例结构一致:

def main():
    app = QApplication(sys.argv)
    main_win = overviewWindow()
    main_win.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    # 导入必要模块
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QFrame, QPushButton
    import sqlite3
    # 定义全局窗口尺寸(根据你的实际需求调整)
    winWidth = 800
    winHeight = 1000
    # 如果你用的是自定义Button类,替换成你的类名;否则用QPushButton
    Button = QPushButton

    main()

关键修改说明

  • 所有窗口类继承QWidget,符合Qt控件体系,便于多窗口管理
  • 将QApplication初始化移到main函数,确保程序只有一个应用实例
  • 复用窗口尺寸、背景样式代码,避免重复编写
  • 给主窗口按钮添加点击事件,触发第二个窗口的打开逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:05:34