2009-05-02 41 views
10

Tôi đang làm việc trên một dự án trong C++ và QT, và tôi muốn mở một cửa sổ QWidget mới, yêu cầu người dùng tương tác với nó, vv, sau đó thực hiện trở lại phương thức đã mở cửa sổ. Ví dụ (MyClass được thừa hưởng QWidiget):Đợi đến khi QWidget đóng

void doStuff(){ 

    MyClass newWindow = new Myclass(); 
    /* 
     I don't want the code down here to 
     execute until newWindow has been closed 
     */ 
} 

tôi cảm thấy như có nhiều khả năng một cách thực sự dễ dàng để làm điều này, nhưng đối với một số lý do tôi không thể tìm nó ra. Tôi có thể làm cái này như thế nào?

Trả lời

22

MyClass kế thừa QDialog. Sau đó, mở nó như một hộp thoại phương thức với exec().

void MainWindow::createMyDialog() 
{ 
    MyClass dialog(this); 
    dialog.exec(); 
} 

Check-out http://qt-project.org/doc/qt-4.8/qdialog.html

+0

Đó là chính xác những gì tôi đang tìm kiếm, cảm ơn bạn! – Jarek

+0

Vui vì tôi có thể giúp. –

+0

Sử dụng QDialog có các hiệu ứng phụ - nó được hiển thị khác nhau theo mặc định và phím Escape đóng nó lại. Tôi tin rằng câu trả lời của @ 56ka tránh điều này. – Jonathan

0

Tại sao không đặt mã bạn không muốn thực hiện cho đến khi cửa sổ đóng trong một chức năng riêng biệt và kết nối đây là SLOT để đóng cửa sổ SIGNAL?

+0

Cảm ơn, mà âm thanh như một ý tưởng tốt. Làm thế nào tôi sẽ làm điều này? Tôi chưa bao giờ có tín hiệu/khe cắm mã hóa cứng, chỉ sử dụng chúng thông qua QTDesigner. – Jarek

+0

Bạn sẽ phải sửa đổi các tệp mã nguồn. – dirkgently

10

Một cách khác là sử dụng một vòng lặp mà chờ đợi trên trong lễ bế mạc:

#include <QEventLoop> 

void doStuff() 
{ 
    // Creating an instance of myClass 
    MyClass myInstance; 
    // (optional) myInstance.setAttribute(Qt::WA_DeleteOnClose); 
    myInstance.show(); 

    // This loop will wait for the window is destroyed 
    QEventLoop loop; 
    connect(this, SIGNAL(destroyed()), & loop, SLOT(quit())); 
    loop.exec(); 
} 
Các vấn đề liên quan