5

Qt GUI アプリケーションにユーティリティ クラスがあります。QMessageBox::critical()ただし、私の便利なクラスでは、warning()、などを呼び出したかったのです。クラスは ではないため、親としてQWidget渡すことはできません。thisただし、私のクラスは からサブクラス化されQObjectているため、シグナルやスロットなどを実行できます。これを回避するには、可能であれば、静的 API を使用する代わりに、プロパティ API を確認する必要がありますか?

クラス宣言:

class NetworkManager : public QObject

失敗する静的 API 呼び出しの例を次に示します。

QMessageBox::critical(this, tr("Network"), tr("Unable to connect to host.\n"),
QMessageBox::Ok | QMessageBox::Discard);

では、プロパティ ベースの API メッセージ ボックスを作成する場合、何らかの方法でそれを呼び出すことは可能でしょうQObjectか? プロパティ ベースの API を実際に使用したことはありませんが、ドキュメントから、イベント ループ (つまりexec()) を使用しているように見えることは理解しています。

4

2 に答える 2

9

NULL最初のパラメーターを渡すだけです。

QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("..."));
于 2013-03-19T15:17:38.597 に答える
5

渡すよりも良い方法はnullptr、既に使用している qobject ツリーを使用することです (NetworkManager インスタンスの親が QWidget であると仮定します。qobject ツリーの外観に応じて親の数を調整します)。

QMessageBox::critical(qobject_cast<QWidget *> (parent()), "Title", "Message");

C または C++ スタイルのキャストの代わりに qobject_cast<> を使用するのは、少し保護を追加し、QWidget * に上向きにキャストできない場合は 0 を返すためです。

を使用nullptrするQMessageBoxと、クラスの qobject ツリーの上位に実際に表示されるウィンドウではなく、最上位のウィンドウ (QWidget) の中央に表示されますNetworkManager。これは、複数のモニター、多数のウィンドウが開いている、複数のモニターにまたがる単一のアプリケーションからの複数のウィンドウなどを使用している人々を本当に悩ませます。

于 2013-03-19T16:05:17.380 に答える