爱吃糖的ω猫 2025-01-01 00:59 采纳率: 100%
浏览 5
已结题

刚学 PyQt5 遇到的一点问题,希望能帮我解答下

刚学 PtQt5,我尝试在一个窗口中打开另一个窗口,在第二个窗口中建立一个按钮连接了一个输出函数,希望点击这个按钮能输出我想要的东西。
但是事实上没有发挥作用,不懂为什么会这样。发给 gpt 也没得到有用的答案,希望能帮我解答一下,看看该如何修改。

以下是代码:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout


class Ui_add:
    def setupUi(self, add_ui):
        add_ui.resize(400, 290)

        self.gridLayout = QGridLayout(add_ui)

        # 创建并配置按钮
        self.pushButton = QPushButton(add_ui)
        self.pushButton.setText("确认")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        self.pushButton.clicked.connect(self.confirm)  # 连接按钮的点击事件

    def confirm(self):
        print('Confirm button clicked')


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Main Window")
        self.setGeometry(100, 100, 600, 400)

        # 创建并连接按钮
        self.add_button = QPushButton("Open Add Window", self)
        self.add_button.setGeometry(200, 150, 200, 50)
        self.add_button.clicked.connect(self.add_person)

    def add_person(self):
        self.add_window = QWidget()
        add_window_ui = Ui_add()  # 创建 Ui_add 类的实例
        add_window_ui.setupUi(self.add_window)  # 设置新窗口界面
        self.add_window.show()  # 显示新窗口


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()
  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-01-01 01:05
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你的代码中存在一个问题,即Ui_add类的实例在创建后没有被保留下来,导致其方法(如confirm)不能正确地与按钮的点击事件绑定。为了解决这个问题,你需要确保Ui_add类的实例能够在MainWindow中被保存,以便于持续监听事件。

    下面是修改后的代码:

    1. MainWindow类中添加一个属性来保存Ui_add类的实例。
    2. 修改add_person方法以使用这个新属性。
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
    
    class Ui_add:
        def setupUi(self, add_ui):
            add_ui.resize(400, 290)
    
            self.gridLayout = QGridLayout(add_ui)
    
            # 创建并配置按钮
            self.pushButton = QPushButton(add_ui)
            self.pushButton.setText("确认")
            self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
            self.pushButton.clicked.connect(self.confirm)  # 连接按钮的点击事件
    
        def confirm(self):
            print('Confirm button clicked')
    
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Main Window")
            self.setGeometry(100, 100, 600, 400)
    
            # 创建并连接按钮
            self.add_button = QPushButton("Open Add Window", self)
            self.add_button.setGeometry(200, 150, 200, 50)
            self.add_button.clicked.connect(self.add_person)
    
            # 用于存储子窗口和UI组件
            self.add_window = None
            self.add_window_ui = None
    
        def add_person(self):
            if not self.add_window:  # 如果还没有创建子窗口,则创建它
                self.add_window = QWidget()
                self.add_window_ui = Ui_add()  # 创建 Ui_add 类的实例
                self.add_window_ui.setupUi(self.add_window)  # 设置新窗口界面
            self.add_window.show()  # 显示新窗口
    
    
    if __name__ == "__main__":
        app = QApplication([])
        window = MainWindow()
        window.show()
        app.exec_()
    

    解释:

    • self.add_windowself.add_window_ui:这两个变量分别用来保存子窗口本身及其对应的UI对象。这样做的好处是保证了当打开子窗口时,UI对象依然有效,并且可以响应用户的交互。
    • 条件检查:通过if not self.add_window:确保只创建一次子窗口。如果用户再次点击“打开添加窗口”按钮,程序将直接显示已有的子窗口而不是重复创建新的实例。

    现在,当你运行这段代码并点击“确认”按钮时,你应该能看到控制台输出Confirm button clicked

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 1月1日