手动关闭Modal QDialog而不连接按钮 - 代码完成后挂起的对话框

时间:2016-10-25 08:08:19

标签: c++ qt dialog modal-dialog qdialog

我知道在网络上提供的模态对话框(QDialog)和examples的应用和使用,但我的用途是显示进度。

尝试过:

根据herehere的帖子/帖子,我发现使用accept()done()close()setResult()但是没有这些关闭对话框,对话框就会挂起。

我有一个connect()来“点击关闭”,但这并不完全满足要求,因为在任何一种情况下成功或不成功执行都会等待用户输入。

更新:刚试过setResult(Accepted);,即使成功执行,QDialog仍然悬空。

问题:

模态对话框用于显示进度,成功执行的结束应自动关闭模态对话框,但如果未成功执行,对话框应保持打开状态,以便用户查看显示的错误。

使用过的功能:

我已经使用了上面提到的这些功能。这些没有关闭对话框,对话框只是挂起等待用户交互(即通过按钮从一个按钮手动关闭它)

CODE:

对话框执行:

dlgConnectStatus = new LoginStatusDialog(login, key, auth);
dlgConnectStatus->setModal(true);
int res = dlgConnectStatus->exec();               << see note below
qDebug() << "dlgConnectStatus result = " << QString::number(res);

注意:运行执行的所有代码都在dlgConnectStatus类的构造函数中。此代码仅在调用dlgConnectStatus->exec();时执行,但是不会返回任何结果,代码会在最后一个构造函数行之后执行并挂起。

我尝试添加:

if (Return_Object->getCode() == ReturnCode::netcon_LoginSuccess) {
    setResult(Accepted);
    accept();
}

但它还是挂了!

*完成信息(无关紧要,但有关上下文):

代码执行(成功与否)之后,在销毁之前从dlgConnectStatus对象中提取公共对象。*

TL; DR

如何关闭QDialog,手动输入模态?

创建问题的裸/基本代码

致电代码:

dlgConnectStatus = new LoginStatusDialog(login, key, auth);
qDebug() << "Done LoginStatusDialog, setting modal";
dlgConnectStatus->setModal(true);
qDebug() << "Done setting modal, executing";
int res = dlgConnectStatus->exec();
qDebug() << "dlgConnectStatus result = " << QString::number(res);

//see below for debugger output -> the qDebug output

LoginStatusDialog.h

#ifndef LOGINSTATUSDIALOG_H
#define LOGINSTATUSDIALOG_H

#include <QDialog>
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include <thread>

#include "returnobject.h"
#include "datamanager.h"

namespace Ui {
class LoginStatusDialog;
}

class LoginStatusDialog : public QDialog
{
    Q_OBJECT

public:
//    explicit LoginStatusDialog(QWidget *parent = 0);
    LoginStatusDialog( QString _login,  QString _key, QString *_auth_tok, QWidget *parent = 0);
    ~LoginStatusDialog();

private:

    Ui::LoginStatusDialog *ui;
    QString login, key;

    ReturnObject *Return_Object;

    void initGui();
};

#endif // LOGINSTATUSDIALOG_H

LoginStatusDialog.cpp

//custom constructor 
LoginStatusDialog::LoginStatusDialog( QString _login,  QString _key, QString *_auth_tok, QWidget *parent) :
    QDialog(parent), ui(new Ui::LoginStatusDialog), login(_login), key(_key)
{
    ui->setupUi(this);

    //this code is basically self explanitory
    Return_Object = new ReturnObject(ReturnCode::netcon_LoginSuccess, QString(""));

    if (Return_Object->getCode() == ReturnCode::netcon_LoginSuccess) {
        //by use ofbreakpoints, I can verify this close is reached but not executed.
        qDebug() << "pre close";
        close();
        qDebug() << "post close";
    }
}

调试信息

Debugging starts
Creating LoginStatusDialog
pre close
post close
Done LoginStatusDialog, setting modal
Done setting modal, executing
//remains open

1 个答案:

答案 0 :(得分:1)

你的close检查是在构造函数中进行的,但是exec在它之后调用,所以你需要在构造函数中做一些像timer这样的事情,并用插槽连接它的超时信号,它将包含你的登录检查。此外,只有在exec调用后才能重新实现exec方法以启动计时器。