2011-07-01 32 views
7

Có cách nào để có chức năng trong lớp ứng dụng của tôi (bắt nguồn từ QApplication) được gọi khi QCoreApplication::exec() được gọi không? Tôi không thấy bất kỳ tín hiệu hoặc sự kiện nào được tạo ngay trước vòng lặp tin nhắn bắt đầu.Ứng dụng đánh chặn Qt :: exec trong lớp ứng dụng?

Tôi có các thành phần khác nhau được tạo phụ thuộc vào đối tượng ứng dụng đầy đủ hàm tạo. Đổi lại, một số thành phần khác cần phải được tạo ra sau khi các thành phần đó (vì chúng dựa vào chúng) - tuy nhiên đây là các hộp thoại chính trong ứng dụng, vì vậy một cái gì đó phải bắt đầu chúng.

Hiện tại tôi chỉ đăng một tín hiệu được xếp hàng đợi từ hàm tạo ứng dụng, sau đó được xử lý khi vòng lặp sự kiện bắt đầu. Tôi chỉ tự hỏi nếu có một cách rõ ràng hơn để đánh chặn exec?

+0

Nghe có vẻ ổn nhưng tôi không thực sự hiểu/hiểu tại sao bạn cần tín hiệu xếp hàng đợi đó. Bạn không cần vòng lặp sự kiện đang chạy để xây dựng tiện ích, chúng sẽ không hiển thị. – Mat

+0

Có một chút khung hỗ trợ trong hàm 'main' cần được hoàn thành trước khi bất kỳ tiện ích nào có thể được xây dựng. Khung công tác đó cần một đối tượng Application constructor đầy đủ. –

Trả lời

1

đây là kỹ thuật cũ trong các ứng dụng gui nhưng có thể phù hợp với bạn.

sử dụng QObject::startTimer(0) sau đó triển khai lại QObject :: timerEvent() để có số various components that rely on a fully constructed application object. Bằng cách đó, various components that rely on a fully constructed application object sẽ chỉ được tạo khi vòng lặp sự kiện bắt đầu.

một chút giải thích: QObject :: startTimer (int ms) là một chức năng chạy một bộ đếm thời gian trong mili giây mà đám cháy mỗi ms. Nếu bạn vượt qua "0" làm đối số, thì nó sẽ kích hoạt ngay sau khi vòng lặp sự kiện bắt đầu. một khi nó cháy, nó gọi QObject :: timerEvent() trong cùng một lớp QObject :: startTimer() đã được gọi. hãy chắc chắn rằng bạn ngừng bộ đếm thời gian với QObject :: killTimer() bên trong reimplementation của bạn của QObject :: timerEvent() hoặc người nào khác bộ đếm thời gian sẽ cháy vô hạn.

nhưng @Mat có một điểm, chỉ vì vòng lặp sự kiện chưa bắt đầu, không có nghĩa là QCoreApplication chưa được xây dựng hoàn chỉnh. Hãy thử và có một cái nhìn này.

{ 
    QApplication app(argc, argv); //this is already a fully contructed QApplication instance 
    MyClass *myObject = new MyClass; //this relies on a fully constructed QApplication instance 

    return app.exec(); //this starts the event loop as you already know. 
} 
Các vấn đề liên quan