PyQt中self.close()后控件不返回问题

1 投票
2 回答
2764 浏览
提问于 2025-04-30 17:18

我正在用PyQt制作一个用户界面。这个界面功能非常简单。当我在终端运行这个脚本时,应该会弹出一个对话框,询问名字,并在按下确定后关闭。不过,我无法从Qt应用程序中返回控制权。

我的代码如下:

class Interactive(QtGui.QWidget):

    def __init__(self):
        super(Interactive,self).__init__()
        self.initGUI()

    def initGUI(self):
            self.setGeometry(300,300,290,150)
            self.setWindowTitle('Input Dialog')
            self.show()

            self.inputdialog =  QtGui.QInputDialog()
            self.inputdialog.move(50,50)

            text, ok = self.inputdialog.getText(self,'Input Dialog','Enter Your Name:')
            #self.text = text
            if ok:
                self.text = text    
                print text
                self.close()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    obj = Interactive()
    #app.exec_()
    if app.exec_():
        sys.exit()
        print "somerandomtext"

在这个类里面的print text是可以正常工作的,但我的测试字符串"somerandomtext"却不行,程序也没有结束。

我查看了类似的问题,但似乎没有一个能解决我遇到的这个问题。我需要为此再写一个处理程序吗?

暂无标签

2 个回答

0
if ok:
                self.text = text    
                print text
                self.deleteLater()

应该结束这个应用程序

1

通常情况下,当最后一个主窗口关闭时,应用程序会自动退出。但在你的例子中,这种情况没有发生,因为你没有让事件循环正常启动。

有很多方法可以重新调整你的例子来避免这个问题,但最简单的方法可能是使用一个定时器,像这样:

class Interactive(QtGui.QWidget):
    def __init__(self):
        super(Interactive,self).__init__()
        # delay initialization
        # self.initGUI()
        ...

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    obj = Interactive()
    QtCore.QTimer.singleShot(0, obj.initGUI)
    app.exec_()
    print "somerandomtext"

补充说明

在另一个回答中提到的 deleteLater() 之所以能“有效”,是因为它会把一个删除事件放到事件队列中(这个事件会在事件循环正常启动后被处理)。而 close() 方法并不会以这种方式放置事件,因此应用程序就没有机会自动退出。

撰写回答