通过单击窗口 B 上的按钮关闭窗口 A

Posted

技术标签:

【中文标题】通过单击窗口 B 上的按钮关闭窗口 A【英文标题】:Close window A by clicking a button on window B 【发布时间】:2021-04-18 10:42:02 【问题描述】:

我有一个带有一些图表和一个按钮“NEXT”的窗口 A。当用户按下按钮时,窗口 B 会打开,其中包含关于窗口 A 上的图形的一些问题。它还有一个“完成”按钮。一旦按下“完成”,窗口 A 和 B 就会关闭。

问题:我没有关闭窗口 A,控制台中也没有错误消息。

窗口 A:

class Window_A(QDialog):

    def __init__(self, parent = None):
        super(Window_A, self).__init__(parent,flags=Qt.WindowMinimizeButtonHint|Qt.WindowCloseButtonHint)
        self.setWindowTitle("Window A")
        self.initUI()
    
    def initUI(self):
        # Load the images
        [...]

        #"NEXT button"
        self.b_next = QPushButton("NEXT")

        self.b_next.clicked.connect(self.open_next)

        #Layout
        [...]

  def close_win(self):
      self.close()
    
  def open_next(self):
      self.next= Window_B()
      self.next.show()

窗口 B:

class Window_B(QDialog):

    def __init__(self):
        super(Window_B, self).__init__()
        self.setWindowTitle("Window_B")
        self.initUI()

    def initUI(self):
        #define text labels
        [...]

        #done button
        self.d_button = QPushButton("Done")
        self.d_button.clicked.connect(self.on_click)
        self.d_button.clicked.connect(lambda:self.close())
    

        #layout for text (questions)
        [...]

    def on_click(self):
        Window_A().close_win()

【问题讨论】:

【参考方案1】:

在您的 window_B 代码中,您不知道对正确 window_A 对象的引用。 所以你的线:

def on_click(self):
    Window_A().close_win()

创建一个新的 Window_A 对象,立即调用它的 close 函数,并尽快将这个对象作为垃圾回收。

您需要在 B 对象中传递对 A 的引用。 例如:

在 window_A.py 中

    def open_next(self):
        self.next= Window_B()
        self.next.show()
        self.next.ref_to_close_father = self

在window_B.py中

    def on_click(self):
        self.ref_to_close_father.close_win()

这应该会更好(但您的示例无法重现,因此可能存在另一个问题。

顺便说一句,

self.d_button.clicked.connect(lambda:self.close())

可能只是

self.d_button.clicked.connect(self.close)

【讨论】:

引用成功了,谢谢!又学到了新东西。 还值得注意的是Window_A().close_win() 确实为新实例创建任何引用,甚至在本地范围内也没有。它几乎就像在做list().append('x'):你没有为新实例分配任何引用,所以无论你用它做什么,只要最后一个函数(close_win())返回,它就会被垃圾收集。请考虑在 some 情况下它会起作用(显然,我说的是新实例,而不是关闭现有实例):调用 Window_A(self).show() 将创建对父级的隐式引用,因此将实际显示新窗口。

以上是关于通过单击窗口 B 上的按钮关闭窗口 A的主要内容,如果未能解决你的问题,请参考以下文章

关闭按钮单击jquery模式弹出窗口

尝试通过单击打开它的 div 中断按钮外部来关闭弹出窗口

C或C++.NET语言中,想实现点击按钮后关闭当前窗口和所有窗口?

js如何实现父窗口前端显示,如果父窗口关闭则重新打开

C# Winform多窗口间切换

MFC 中标题栏上的关闭按钮