我知道在网络上提供的模态对话框(QDialog)和examples的应用和使用,但我的用途是显示进度。
尝试过:
根据here和here的帖子/帖子,我发现使用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
答案 0 :(得分:1)
你的close检查是在构造函数中进行的,但是exec在它之后调用,所以你需要在构造函数中做一些像timer这样的事情,并用插槽连接它的超时信号,它将包含你的登录检查。此外,只有在exec调用后才能重新实现exec方法以启动计时器。