【问题标题】:Terminating QWidget doesn't work终止 QWidget 不起作用
【发布时间】:2017-09-04 13:10:39
【问题描述】:

我使用self.close 关闭正在运行的小部件。整个代码如下:

class timeTracker(QWidget):
        '''time tracker main application v_0.8'''
    def __init__(self, parent=None):
        super(timeTracker, self).__init__(parent)
        self.grid = QGridLayout()
        self.setLayout(self.grid)

        while not self.connectivity():
            print(self.connectivity())
            ret = QMessageBox.warning(self, "Not connected to network. Please check the connection", "", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            if ret == QMessageBox.No:
                self.close()
                qApp.quit()
                break
            qApp.quit()
        # self.time_widget = timeline.timeWidget()
        # self.grid.addWidget(self.time_widget, 0, 0)


    def connectivity(self):
        try:
            urllib.request.urlopen("http://www.google.com", timeout=1)
            return True
        except urllib.error.URLError as error:
            return False

if __name__ == "__main__":
    application = QApplication(sys.argv)
    main_widget = timeTracker()
    main_widget.show()
    main_widget.move(10, 10)
    sys.exit(application.exec_())

我对这段代码的期望是,只要连接函数返回 True,如果用户单击“是”,就会反复要求用户执行特定操作。如果他们单击否,我想终止整个小部件。但是当我单击否时,它只会通过 self.close 之后的行。我该怎么做才能真正终止程序?

【问题讨论】:

  • 什么是check_function()
  • 阻塞循环对于 GUI 设计来说不是用户友好的,还有其他选项,例如使用 QTimers。但是您提供的代码无法帮助您。
  • @eyllanesc check_function() 实际上会检查网络连接,单击“是”将检查网络,如果已连接,则发出 False 并继续执行下一个代码。但是点击否,因此执行 self.close() 不会关闭正在运行的应用程序。
  • 如果您执行该任务,我建议创建一个执行此任务的 QThread,并通过执行在主线程中显示警告的任务发出一些信号。如果您显示该功能,我可以输入适当的代码。
  • @eyllanesc 我已经上传了我的全部代码,我会看看 QThread。提前致谢!

标签: python pyqt pyqt5


【解决方案1】:

要强制关闭应用程序,在这种情况下,我们可以使用sys.exit()

if ret == QMessageBox.No:
    sys.exit(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2016-05-31
    相关资源
    最近更新 更多