Vấn đề là như sau: nếu ứng dụng được đóng trong khi nó không chủ động làm bất cứ điều gì, nó thoát đúng cách. Nếu nó tích cực làm việc trên một cái gì đó (chờ đợi trong một vòng lặp while, ví dụ), tuy nhiên, cửa sổ chính sẽ đóng nhưng chương trình sẽ tiếp tục chạy trong nền, như được xác nhận bằng cách mở trình quản lý tác vụ.Ứng dụng Qt vẫn còn trong bộ nhớ ngay cả sau khi MainWindow bị đóng
Tôi đã dành phần lớn thời gian hôm nay để giải quyết vấn đề và triển khai các bản sửa lỗi có thể, nhưng vô ích. Có vẻ như hàm quit() đơn giản là không làm gì cả. Dưới đây là một số điều tôi đã thử:
- Sử dụng
app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
. Tôi biết tín hiệu được kích hoạt, bởi vì tôi đã thử thay đổi&app, SLOT(quit())
thànhqApp, SLOT(aboutQt())
và cửa sổ aboutQt xuất hiện một thời gian ngắn. - Bao gồm
qApp->quit();
ở đầu hàm chạy từ nút cửa sổ chính. Ứng dụng chạy đến dòng đó, nhưng nó không có hiệu lực. - Sử dụng
processEvents()
để đảm bảo GUI đang được cập nhật. - Bao gồm các câu như
mainWindow.setAttribute(Qt::WA_QuitOnClose);
trong main.cpp.
Tôi chỉ muốn ứng dụng thoát hoàn toàn khi cửa sổ chính đóng.
Tôi đang sử dụng thư viện qextserialport, nếu điều đó tạo ra bất kỳ sự khác biệt nào.
Ứng dụng của bạn có đa luồng không? – Lol4t0
Tôi không phải là cá nhân tạo chủ đề, nhưng tôi không chắc chắn nếu thư viện tôi đang sử dụng là. Nếu tôi mở trình gỡ rối và xem theo chủ đề, tôi sẽ thấy một loạt các hàm "ntdll! LdrFindResourceEx_U". Tuy nhiên, tôi chỉ thấy một ví dụ của chương trình của tôi trong các quy trình quản lý tác vụ. PS: Tại sao địa ngục sẽ nhấn enter gửi tin nhắn thay vì tạo ra một linebreak? – SharpHawk
Sau đó, chủ đề chính của bạn có thể chờ đợi những chủ đề để hoàn thành công việc của họ. Nó có thể được thực hiện hoàn toàn, ví dụ, destructors của các đối tượng có thể chờ đợi cho thread để kết thúc. Bạn nên nghiên cứu mã thư viện của mình. PS 'qextserialport', theo như tôi biết không tạo ra bất kỳ chủ đề nào. – Lol4t0