2015-07-14 19 views
2

У меня есть QDialog и QStateMachine. Этот цикл завершается, когда все приложения закрыты, но я хочу завершить цикл, когда Qdialog закрыт. Как я могу это сделать?Как закончить QStateMachine, когда QDialog закрыт?

QStateMachine sm; 
    QState s1(&sm), s2(&sm); 
    sm.setInitialState(&s1); 
    QEventTransition transition(dialog, QEvent::Close); 
    s2.addTransition(&transition); 
    QEventLoop loop; 
    QObject::connect(&s2, &QState::entered, &loop, &QEventLoop::quit); 
    sm.start(); 
    dialog->show(); 
    loop.exec(); 

ответ

2

Используйте QFinalState класс для этого. На отметке docs показан пример использования QPushButton с выходом. Вам просто нужно подключить его к сигналу finished(), например.

UPD

Некоторые примеры использования:

MainWinow.h

class MainWindow : public QMainWindow, private Ui::MainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 

private: 
    QDialog *dialog; 
private slots: 
    void on_pushButton_clicked(); 
}; 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    setupUi(this); 

    dialog = new QDialog; 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    // Open dialog after push button was clicked 
    if (!dialog) 
     dialog = new QDialog; 

    QEventLoop loop; 
    QStateMachine machine; 
    QState *s1 = new QState(); 

    QFinalState *s2 = new QFinalState(); 
    s1->addTransition(dialog, SIGNAL(finished(int)), s2); 

    connect(&machine, QStateMachine::finished, [&loop]{ 
     qDebug() << "Finished"; 
     loop.quit(); 
    }); 

    machine.addState(s1); 
    machine.addState(s2); 
    machine.setInitialState(s1); 
    machine.start(); 


    dialog->show(); 
    loop.exec(); 

    qDebug() << "Really finished"; 
} 

Так мы создаем QEventLoop, QStateMachine и добавить состояния (ини t состояние и конечное состояние). Затем подключите сигнал QDialog::finished() с переходом в конечное состояние и подключите сигнал QStateMachine::finished() с слотом, где цикл событий будет остановлен. Затем покажите QDialog и запустите QStateMachine.

На консоли напечатает:

Готовые

Realy закончил

+0

ссылка не работает! – EmreS

+0

@EmreS Отредактировано, извините –

+0

это нормально, но у меня есть цикл выше кода, я хочу остановить цикл, когда QDialog закрыт? – EmreS