gpt4 book ai didi

c++ - 模态对话框在调用接受、完成或关闭后挂起

转载 作者:行者123 更新时间:2023-11-28 05:27:32 25 4
gpt4 key购买 nike

我有一个模态对话框调用者:

qDebug() << "Creating LoginStatusDialog";
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 debug info and output

这会调用一个在下面执行的自定义构造函数

LoginStatusDialog.cpp(提取):

LoginStatusDialog::LoginStatusDialog( QString _login,  QString _key, QString *_auth_tok, QWidget *parent) :
QDialog(parent), ui(new Ui::LoginStatusDialog), login(_login), key(_key)
{
ui->setupUi(this);
Return_Object = new ReturnObject(ReturnCode::netcon_LoginSuccess, QString(""));
if (Return_Object->getCode() == ReturnCode::netcon_LoginSuccess) {
qDebug() << "pre close";
close();
//accept - hangs
//done(0); - hangs
qDebug() << "post close";
}
}

LoginStatusDialog header

#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

调试信息

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

通过研究,一些 SO 帖子提到使用 done()close()accept() 关闭对话框

使用 CONNECT() 使用 close() 方法关闭对话框,但尝试手动关闭它没有成功。

有人建议使用计时器任务,但这似乎不是关闭对话框的实际方法。

有什么想法吗?

最佳答案

这似乎更像是一个一般的设计问题。如果你真的想那样做,你可以使用计时器。但简单的重新设计可能更有帮助。

如果您只想在发生错误时显示对话框,为什么不只在错误发生时显示它呢?

Return_Object = new ReturnObject(ReturnCode::netcon_LoginSuccess, QString(""));
if (Return_Object->getCode() != ReturnCode::netcon_LoginSuccess)
{
dlgConnectStatus = new LoginStatusDialog(Return_Object);
dlgConnectStatus->setModal(true);
int res = dlgConnectStatus->exec();
//...
}

这样,只负责显示信息的对话框就只会做这个了。显示登录错误。创建对话框然后立即关闭它似乎是一个设计缺陷(特别是考虑到好的情况应该是您的默认情况)。

如果对话框正在执行额外的操作,您应该考虑在用于显示信息的类中真正需要多少代码。

关于c++ - 模态对话框在调用接受、完成或关闭后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com