2012-01-16 19 views
14

Tôi có một ứng dụng Qt với loại main() ...Qt: Có thông báo khi vòng lặp sự kiện bắt đầu không?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWin; 

    ... A separate, non-GUI thread is launched here 

    mainWin.Init(); 
    mainWin.show(); 

    app.exec(); 
} 

chủ đề này khác được tạo ra trước khi MainWin cần phải biết khi nào nó có thể bắt đầu giao tiếp với MainWin. Nhưng kể từ khi mainWin sử dụng tín hiệu Qt, slot, timer, vv, nó không thực sự sẵn sàng để rock cho đến khi vòng lặp sự kiện đang chạy (thông qua exec()).

Câu hỏi của tôi là: có một số tín hiệu hoặc sự kiện được phát ra khi vòng lặp sự kiện đã bắt đầu không?

Hãy xem xét điều này. Trong mainWin.Init(), bạn có thể tạo một cái gì đó giống như một QTimer và thậm chí gọi .start() để khởi động nó. Nhưng nó sẽ không thực sự chạy và kích hoạt các sự kiện cho đến khi exec() được gọi. Đây là lý do tại sao tôi cần phải biết khi vòng lặp sự kiện đã thực sự bắt đầu.

+0

Chủ đề của bạn có phải là chuỗi Qt hoặc gốc không? – UmNyobe

Trả lời

9

Bạn có thể gửi một tín hiệu đến cửa sổ của bạn trước khi exec() gọi. Điều này sẽ đặt một mục trong hàng đợi tín hiệu của app. Khi exec() đang chạy, tín hiệu sẽ được gửi và cửa sổ của bạn sẽ biết rằng vòng lặp sự kiện đang chạy.

Cách đơn giản là sử dụng QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted())); kết nối với khe tùy chỉnh của lớp cửa sổ của bạn.

1

Bạn có thể làm điều đó theo thứ tự sau:

QApplication app(argc, argv); 
Mainwinwdow mainWin; 
QThread yourThread; 

//connect the signals from the thread to the mainWin here 

mainWin.Init(); 
mainWin.show(); 

yourThread.start(); 

return app.exec(); 
+1

FYI, điều này dường như không hoạt động với PyQt. Các tín hiệu nào đó đang được phát ra và được xử lý trước khi gọi app.exec_(). – orodbhen

2

Vì tín hiệu phát ra không bị mất khi vòng lặp sự kiện chưa chạy, chuỗi của bạn có thể không nhất thiết phải biết khi nào cửa sổ của bạn sẵn sàng.
Chuỗi của bạn có thể bắt đầu gửi tín hiệu đến cửa sổ ngay lập tức nhưng chỉ nhận được tín hiệu từ cửa sổ khi vòng lặp sự kiện đang chạy.