我有QDialog和QStateMachine。当所有应用程序关闭时,此循环终止,但当Q对话框关闭时,我希望终止循环。我怎么能这么做?
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();发布于 2015-07-14 08:15:31
为此使用QFinalState类。在文档示例中,显示了QPushButton和exit的用法。例如,您只需将其与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和add状态(init状态和最终状态)。然后将QDialog::finished()信号连接到最终状态,并将QStateMachine::finished()信号与中断事件循环的时隙连接起来。然后显示QDialog并启动QStateMachine。
控制台将打印:
完成 真已完成
https://stackoverflow.com/questions/31399044
复制相似问题