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

PyQt5对话框无法关闭求助:点击按钮无响应

问题分析与解决方案

核心问题1:UI加载目标错误

在CreateOrOpenProjectDialog的构造函数中,你错误地将UI加载到了父窗口(parent)上,而非当前对话框实例本身。这导致按钮触发信号时,实际操作的是内部未显示的对话框,用户看到的外层对话框不会响应关闭操作。

修改CreateOrOpenProjectDialog的__init__方法:

def __init__(self, parent=None):
    """Constructor."""
    super(CreateOrOpenProjectDialog, self).__init__(parent)
    # 将parent改为self,把UI加载到当前对话框实例上
    self.setupUi(self)
    self.connectSignalsSlots()

核心问题2:多余的对话框嵌套

你定义的MyDialog类属于冗余嵌套:调用MyDialog.exec()显示的是外层空对话框,但按钮事件的处理逻辑属于内部的CreateOrOpenProjectDialog,它的accept()只能关闭自己,无法影响外层对话框。

直接简化createProject方法,删除MyDialog类:

def createProject(self):
    # 直接实例化目标对话框
    dialog = CreateOrOpenProjectDialog(self)
    # exec()返回对话框结果码,可用于判断用户操作
    result = dialog.exec()
    if result == QtWidgets.QDialog.Accepted:
        print("showOutput:")
        print(dialog.clickedButton)

完整修正后的代码

Ui_mainWindow修正版

import os

from .createOrOpenProjectDialog import CreateOrOpenProjectDialog
from qgis.PyQt import uic
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (QDialog)

FORM_CLASS, _ = uic.loadUiType(os.path.join(os.path.dirname(__file__), 'ui', 'window.ui'))

class Ui_mainWindow(QtWidgets.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        """Constructor."""
        super(Ui_mainWindow, self).__init__(parent)
        self.setupUi(self)
        self.connectSignalsSlots()

    def connectSignalsSlots(self):
        print("main.connectSignalsSlots 1")
        self.pushButton1.clicked.connect(self.createProject)
        print("main.connectSignalsSlots 2")
        
    def createProject(self):
        dialog = CreateOrOpenProjectDialog(self)
        result = dialog.exec()
        if result == QtWidgets.QDialog.Accepted:
            print("showOutput:")
            print(dialog.clickedButton)

CreateOrOpenProjectDialog修正版

import os

from qgis.PyQt import uic
from PyQt5.QtWidgets import (QDialog)

FORM_CLASS, _ = uic.loadUiType(os.path.join(os.path.dirname(__file__), 'ui', 'dialog.ui'))

class CreateOrOpenProjectDialog(QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        """Constructor."""
        super(CreateOrOpenProjectDialog, self).__init__(parent)
        self.setupUi(self)
        self.connectSignalsSlots()

    def connectSignalsSlots(self):
        self.createProject_btn.clicked.connect(self.createProject)
        self.openProject_btn.clicked.connect(self.openProject)

    def createProject(self):
        print("dialog.createProject")
        self.clickedButton = "createProj"
        self.accept()
        
    def openProject(self):
        print("dialog.openProject")
        self.clickedButton = "openProj"
        self.accept()

关键逻辑说明

  1. UI加载目标:setupUi(self)确保Qt Designer设计的UI元素绑定到当前对话框实例,按钮信号才能正确关联到对话框的关闭方法。
  2. 模态对话框:exec()以模态方式显示对话框,用户必须处理完该对话框才能返回主窗口,调用accept()时对话框会自动关闭并返回确认状态。
  3. 结果判断:通过exec()的返回值,可以确认用户是点击了功能按钮还是直接关闭对话框,避免读取未初始化的clickedButton属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:24