27

QDialog同様の機能を実装するためにサブクラス化しましたQMessageBox(カスタマイズを可能にするためにこれが必要でした)。テキスト メッセージと [OK]、[キャンセル] ボタンがあります。exec()ブロックするために使用するダイアログを表示しています。では、ユーザーが [OK] または [キャンセル] をクリックしたときに true/false の値を返すにはどうすればよいでしょうか?

ボタンを接続してからsetResult()、クリックすると結果の値を返すようにしましたが、

  1. ボタンをクリックしてもダイアログ ボックスが閉じない
  2. 戻り値が正しくありません。以下は私が書いたコードです。exec/result 部分が間違っていると思いますが、修正方法がわかりません。
class MyMessageBox : public QDialog {
    Q_OBJECT

private slots:

    void onOKButtonClicked() { this->setResult(QDialog::Accepted); }
    void onCancelButtonClicked() { this->setResult(QDialog::Rejected); }

public:
    MyMessageBox(QMessageBox::Icon icon, const QString& title,
        const QString& text, bool showCancelButton = true,
        QWidget* parent = 0);

    virtual void resizeEvent(QResizeEvent* e);

    QDialog::DialogCode showYourself()
    {
        this->setWindowModality(Qt::ApplicationModal);
        this->exec();
        return static_cast<QDialog::DialogCode>(this->result());
    }
};

ユーザーはクラスをインスタンス化しshowYourself()、値を返すと予想される呼び出しを行い、ダイアログを閉じます (そして削除します)。

部分的なコードを投稿しました。さらに必要な場合はお知らせください。完全版を投稿します。

4

3 に答える 3

32

いくつかのポイント:

  1. setResult()自分自身を使用するのではなく、QDialog::accept()QDialog::r​​eject () を使用してください。
  2. シグナルとスロットを十分に活用していないようです。ダイアログの信号をリッスンするには、ダイアログ (または別のダイアログ) を作成するオブジェクトが必要です。
  3. あなたのコードでは、信号をスロットにも接続していません。
  4. 私の修正onOKButtonClickedonCancelButtonClickedは不要です。
  5. 私の修正では、必要ありませんshowYourself()。呼び出すだけexecで、イベント情報が流れます。

ダイアログを表示する前に、次のコードを追加する必要があります (thisダイアログ メソッド内にあると仮定します)。

QObject::connect(acceptButton, SIGNAL(clicked()), this, SLOT(accept()));
QObject::connect(rejectButton, SIGNAL(clicked()), this, SLOT(reject()));

あなたが持っている呼び出し元オブジェクトで

void someInitFunctionOrConstructor(){
   QObject::connect(mydialog, SIGNAL(finished (int)), this, SLOT(dialogIsFinished(int)));
}

void dialogIsFinished(int){ //this is a slot
   if(result == QDialog::Accepted){
       //do something
       return
   }
   //do another thing
}
于 2012-09-18T08:21:25.493 に答える
10

ケース 1ボタンをクリックしても、ダイアログ ボックスが閉じません。

このためには、それぞれのダイアログを閉じる必要があるSLOTSため、使用します

void onOKButtonClicked(){ this->setResult(QDialog::Accepted); this->close();}
void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);this->close();}  

注: 標準の QMessageBox で [OK] ボタンまたは [キャンセル] ボタンをクリックした後にのみ、setResult() 関数がトリガーされ、ステータスが変更されます。逆に行っても同じ効果はありません。

ケース 2戻り値が正しくありません。

ダイアログが閉じられた後でのみ、関数で結果が利用できるようになると思いますresult()。したがって、ケース 1 で指定された変更を行った後、解決されると思います。

それでも解決しない場合は、独自のプライベート メンバー関数を使用して解決します。

于 2012-09-18T05:42:25.080 に答える