2016-10-25 6 views
0

私はアプリケーションとモーダルダイアログ(QDialog)とexamplesの使用を承知しています。閉じるボタンを使用せずに手動でモーダルQDialogを閉じる - コードが完了した後にダイアログがハングする

が試みがあります:

herehereからスレッド/投稿ごととして、私は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 
+0

閉じると、モーダルダイアログが閉じないのですか? – Apin

+0

私はそれが私が上に示したものだと確信しています、従って私はあなたの質問を理解していません。 – KGCybeX

+0

AFAIK 'QWidget'ベースのクラスはコンストラクタが呼び出された後に開かれます。なぜなら、それを画面に表示するコードが' QApplication'のアプリケーションループで呼び出されるからです。あなたのケースでは、ダイアログが最初に開かれていないので、 'close()'は何もしません。 –

答えて

1

近いとあなたのチェックはコンストラクタでやっているが、幹部はそうuがコンストラクタで、タイマーのような何かをすると、それはだ接続する必要がある、それは後に呼んでいますあなたのログインチェックを含むタイムアウト信号をスロットに入れます。また、execメソッドが呼び出された後でなければ、タイマーを起動するためにexecメソッドを再実装できます。

+0

それは似たようなものかもしれない奇妙なアイデアを持っていた – KGCybeX

関連する問題