12

現在、Qt アプリケーションを Mac OSX に移植しようとしていますが、次の問題に遭遇しました。

私のウィンドウ クラス (QMainWindow から派生) の 1 つは、閉じるボタンが押されたときにダイアログ ボックスを表示し、変更を保存/破棄したり、中止したりできます。これは、次のように closeEvent を再実装することによって行われます。

void ResultsWindow::closeEvent(QCloseEvent* event)
{
    if (isWindowModified())
    {
        activateWindow();
        QMessageBox::StandardButton button = QMessageBox::warning(
                this,
                APPLICATION_NAME,
                "Warning: data have been modified. Do you want to save the "
                    "changes?",
                QMessageBox::Save | QMessageBox::Discard | QMessageBox::Abort,
                QMessageBox::Abort);
        switch (button)
        {
            case QMessageBox::Save:
                if (!Save())
                {
                    event->ignore();
                    return;
                }
                break;
            case QMessageBox::Discard:
                break;
            case QMessageBox::Abort:
            default:
                event->ignore();
                return;
        }
    }
    event->accept();
}

予想される動作は次のとおりです。「中止」をクリックすると、イベントは無視され、ウィンドウは開いたままになります。これは、Linux および Windows で期待どおりに機能します。ただし、OSX では、ウィンドウは非表示になっていますが、バックグラウンドでアクティブになっています。ここで何が欠けていますか?窓が開いたままになるようにするにはどうすればよいですか?

更新: これは Qt5 の問題だと思います。closeEventメソッドが何も構成されていない場合event->ignore();、ウィンドウはまだ閉じられています。これは意図した動作ではないと思います。この問題を Qt メーリング リストに投稿する必要があるかもしれません…</p>

更新: これは Qt のバグで、バージョン 5.1 以降で解決されています。

4

5 に答える 5

1

Mac 10.7 で Qt 4.7 を使用していますが、このエラーを再現できません。

無視するたびshow()にマクロの間に置くだけでうまくいくと思います。このようなもの:Q_OS_MACevent

event->ignore();
#ifdef Q_OS_MAC
     show();
#endif

これは完璧な解決策ではないかもしれませんが、確実にこの問題を解決します。

于 2013-02-05T20:16:46.713 に答える
1

それ以外の

case QMessageBox::Abort:
                default:
                        event->ignore();
                        return;

やってみる

case QMessageBox::Abort:
                       event->ignore();
                       return;
 default:
         break
于 2013-02-06T06:24:49.413 に答える
1

ここでは Qt 5.0.0 または Qt 5.0.1 と同じです。ただし、WindowModality を ApplicationModal または WindowModal として設定すると機能します。Cmd+Q を押して終了し、メッセージ ボックスを表示します。

Qt Creator の windowModality

この問題は、Mac OS X の UI と他の UI の違いが原因であると推測されます。おそらく、Qt に関する追加の作業によって、問題を解決できるようになるでしょう。

QMainWindow::event() を再実装しても、同じ結果が得られます。

于 2013-02-05T19:55:59.160 に答える
0

醜い回避策 (テスト済みで動作中)、これを event->ignore() の直後に追加:

QTimer::singleShot(0,this,SLOT(hide()));
QTimer::singleShot(100,this,SLOT(show()));
于 2013-04-27T16:31:49.507 に答える