私はアプリケーションとモーダルダイアログ(QDialog)とexamplesの使用を承知しています。閉じるボタンを使用せずに手動でモーダルQDialogを閉じる - コードが完了した後にダイアログがハングする
が試みがあります:
hereとhereからスレッド/投稿ごととして、私はaccept()
、done()
、close()
、setResult()
を使用することが見つかりましたが、これらはいずれも、ダイアログを閉じていない、ダイアログがちょうどハングします。
「クリックを閉じる」にはconnect()
がありますが、いずれの場合でも成功または不成功の実行がユーザ入力を待つため、これは要件を完全に満たしません。
更新:ちょうどsetResult(Accepted);
を試してみましたが、正常に実行された後でもQDialogはハングしています。
問題:
モーダルダイアログが成功し、実行の終わりには、自動的にモーダルダイアログを閉じるべきで進行状況を表示するために使用されますが、正常に実行されていない場合、ダイアログは、ユーザーのために開いたままにしてください表示されたエラーを表示します。
使用される機能:
私が提案した機能の上にこれらを使用していました。
dlgConnectStatus = new LoginStatusDialog(login, key, auth);
dlgConnectStatus->setModal(true);
int res = dlgConnectStatus->exec(); << see note below
qDebug() << "dlgConnectStatus result = " << QString::number(res);
:
ダイアログがで実行されます。これらは、ダイアログを閉じていない、ダイアログはちょうど
CODE(ボタンからスロットでそれを閉じるmanaully IE)ユーザーとの対話を待ってハング
注:実行を実行するすべてのコードは、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
LoginStatusDi alog.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
閉じると、モーダルダイアログが閉じないのですか? – Apin
私はそれが私が上に示したものだと確信しています、従って私はあなたの質問を理解していません。 – KGCybeX
AFAIK 'QWidget'ベースのクラスはコンストラクタが呼び出された後に開かれます。なぜなら、それを画面に表示するコードが' QApplication'のアプリケーションループで呼び出されるからです。あなたのケースでは、ダイアログが最初に開かれていないので、 'close()'は何もしません。 –