如何destroy QApplication
时间: 2023-02-06 19:17:30 浏览: 108
如果要销毁 QApplication 对象,可以使用 QApplication 的 deleteLater() 方法。这个方法会在事件循环结束后将 QApplication 对象删除。
例如:
```
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// ...
app.deleteLater();
return app.exec();
}
```
注意,在调用 deleteLater() 后,不能再使用 QApplication 对象。因此,应该在调用 deleteLater() 之前确保所有需要使用 QApplication 的操作已完成。
相关问题
RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance.
这个错误通常发生在你在一个应用程序中创建了多个QApplication实例。每个应用程序只能有一个QApplication实例。你需要在创建新的QApplication实例之前销毁旧的实例。
你可以通过以下代码来销毁QApplication实例:
```python
import sys
from PyQt5.QtWidgets import QApplication
if QApplication.instance():
app = QApplication.instance()
app.quit()
# 创建新的QApplication实例
app = QApplication(sys.argv)
```
在这里,我们首先检查是否已经有一个QApplication实例存在。如果是,我们调用`quit()`方法来退出该实例。然后,我们可以创建一个新的QApplication实例。
def start(): global img, pre_pts try: root = tk.Tk() root.withdraw() f_path = filedialog.askopenfilename() if not f_path: messagebox.showinfo('提示', '请选取有效图片') else: img = cv.imread(f_path) pre_pts = -1, -1 cv.namedWindow('picture', cv.WINDOW_NORMAL) cv.resizeWindow('picture', 256, 256) cv.moveWindow('picture', 600, 300) cv.imshow('picture', img) cv.setMouseCallback('picture', draw) cv.waitKey(0) cv.destroyAllWindows() root.destroy() except Exception as e: print("出现错误:", e)上述代码报错时,下列主界面会卡住并退出程序:class Faceshow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(Faceshow, self).__init__(parent) self.setupUi(self) self.main_button.clicked.connect(start) self.main_exit.clicked.connect(self.quit) def quit(self): self.close() if __name__ == '__main__': hxz = QApplication(sys.argv) ui = Faceshow() ui.show() sys.exit((hxz.exec_()))
可能是因为出现了异常,但是异常没有被捕获,导致程序直接退出。你可以在 `start()` 函数中加上异常处理,例如用 `try...except` 块包裹代码,打印出错误信息,然后使程序继续运行。这样就可以避免程序直接退出。修改后的代码如下:
```
def start():
global img, pre_pts
try:
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
if not f_path:
messagebox.showinfo('提示', '请选取有效图片')
else:
img = cv.imread(f_path)
pre_pts = -1, -1
cv.namedWindow('picture', cv.WINDOW_NORMAL)
cv.resizeWindow('picture', 256, 256)
cv.moveWindow('picture', 600, 300)
cv.imshow('picture', img)
cv.setMouseCallback('picture', draw)
cv.waitKey(0)
cv.destroyAllWindows()
root.destroy()
except Exception as e:
print("出现错误:", e)
traceback.print_exc()
class Faceshow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Faceshow, self).__init__(parent)
self.setupUi(self)
self.main_button.clicked.connect(start)
self.main_exit.clicked.connect(self.quit)
def quit(self):
self.close()
if __name__ == '__main__':
hxz = QApplication(sys.argv)
ui = Faceshow()
ui.show()
sys.exit((hxz.exec_()))
```
这样程序就不会卡住并退出了,而是会在控制台中打印出错误信息,方便你进行调试。