Qt 4とQt 5の信号と溝の使用の違い
簡単に述べます。Qt 4とQt 5の信号と溝の接続connectは切断disconnectと違います。
GUIインターフェースというのは、結局はコンポーネントの重ね合わせです。私たちは窓を作って、ボタンを上に置いて、アイコンを上に置いて、インタフェースになります。セットの位置が特に重要です。私たちはコンポーネントをどこに置くかを指定しなければなりません。窓は私たちの必要な方法でレンダリングできます。これはコンポーネントの局在化のメカニズムに関する。Qtは2つのコンポーネントポジショニング機構を提供している:絶対位置決めと配置配置配置配置。
名前の通り、絶対位置付けは最も原始的な位置付け方法です。このコンポーネントの座標と幅を与えます。このように、Qtは、コンポーネントをどこに置くべきかと、コンポーネントの大きさを設定する方法を知っている。しかし、ユーザーが最大化ボタンをクリックするか、マウスを使ってウィンドウの端をドラッグするかなどのウィンドウサイズを変更した場合、絶対的な位置付けのコンポーネントを採用しても応答がありません。これも自然です。Qtを教えていないので、ウィンドウが変わる時、コンポーネントは自分を更新し、どのように更新しますか?コンポーネントを自動的に更新する必要があるなら、これはよくある需要です。例えば、Wordは原稿用紙を大きくして、ツールバーを長くします。あるいは、より簡単な方法があります。ユーザーがウィンドウのサイズを変更することを禁止します。しかし、これは長期的な計画ではない。
このような変化の需要に対して、Qtはもう一つの機構――配置――を提供してこの問題を解決します。コンポーネントをあるレイアウトに入れると、レイアウトは専門のレイアウトマネージャによって管理されます。サイズや位置の調整が必要な場合、Qtは対応するレイアウトマネージャを用いて調整します。
信号と溝のconnect
Qt 4方式:マクロ
type:信号と溝の関連付けを指定するために、信号が直ちに溝に送られるか、それとも後の時間に並んで転送を待つかを決めました。関連方式はエニュメレーションQtを使用しています。:Connection Typeで説明します。以下はその値と意味です。
列挙
値
説明
Qt:AutoConnection
0
*(自動関連、標準値)。受信者が送信信号のスレッド中にいる場合(すなわち信号とスロットが同じスレッド内にある)は、Qt:DirectConnectionを使用する。そうでなければ、Qt:QueueuedConnectionを使用する。信号が送信されるとき、どの関連タイプが使用されるかが決定される。
Qt:DirectConnection
1
直接的に関連する。信号が送信されると、直ちにスロットを呼び出します。スロットが実行された後に、送信信号の後のコード(つまり、emitキーの後のコード)が実行されます。このスロットは信号スレッドで実行されます。
Qt::QueueuedConnection
2
キュー関連。コントロールが受信者スレッドのイベントサイクルに戻ると、スロットが呼び出されます。つまり、emitキーの後のコードは直ちに実行されます。スロットは後で実行されます。このスロットは、受信者のスレッドで実行されます。
Qt::Blocking QueuedConnection
3
列の関連をブロックします。Qt::QueueuedConnectionと同じですが、信号スレッドは溝が戻るまでブロックされます。受信者が信号スレッド内にいると、この接続は使えません。そうでないとアプリケーションはロックされます。
Qt:UniqueConnection
0 x 80
一意の関連これは、ビット単位または上記の任意の接続タイプとの組み合わせを使用することができるフラグである。Qt::UniqueConnectionを設定すると、重複しない場合のみ接続が行われ、重複接続が既に存在している場合(すなわち、同じ信号は同じオブジェクト上の完全に同じ溝を指す)、接続が失敗し、無効なQMetaObjectが返されます。
例形式3のスロット関数は、スラットキー宣言を使用せずに、任意のメンバー関数がスロット関数であってもよい。フォーム1のスロット関数は、sleots修飾 を使用しなければならない。形式1のスロット関数は、prvateの制限を受けず、つまりスロットがprvateであっても、信号でこのスロット関数を呼び出すことができ、形式3ではconnectを使用するとエラーが発生します。 信号と溝のdisconnect形式3のスロット関数は、スラットキー宣言を使用せずに、任意のメンバー関数がスロット関数であってもよい。フォーム1のスロット関数は、sleots修飾 を使用しなければならない。形式1のスロット関数は、prvateの制限を受けず、つまりスロットがprvateであっても、信号でこのスロット関数を呼び出すことができ、形式3ではconnectを使用するとエラーが発生します。 ここでQt 4とQt 5の信号と溝の使い分けについての記事を紹介します。Qt 4とQt 5の信号と溝の内容については、以前の文章を検索してください。または次の関連記事を見てください。これからもよろしくお願いします。
GUIインターフェースというのは、結局はコンポーネントの重ね合わせです。私たちは窓を作って、ボタンを上に置いて、アイコンを上に置いて、インタフェースになります。セットの位置が特に重要です。私たちはコンポーネントをどこに置くかを指定しなければなりません。窓は私たちの必要な方法でレンダリングできます。これはコンポーネントの局在化のメカニズムに関する。Qtは2つのコンポーネントポジショニング機構を提供している:絶対位置決めと配置配置配置配置。
名前の通り、絶対位置付けは最も原始的な位置付け方法です。このコンポーネントの座標と幅を与えます。このように、Qtは、コンポーネントをどこに置くべきかと、コンポーネントの大きさを設定する方法を知っている。しかし、ユーザーが最大化ボタンをクリックするか、マウスを使ってウィンドウの端をドラッグするかなどのウィンドウサイズを変更した場合、絶対的な位置付けのコンポーネントを採用しても応答がありません。これも自然です。Qtを教えていないので、ウィンドウが変わる時、コンポーネントは自分を更新し、どのように更新しますか?コンポーネントを自動的に更新する必要があるなら、これはよくある需要です。例えば、Wordは原稿用紙を大きくして、ツールバーを長くします。あるいは、より簡単な方法があります。ユーザーがウィンドウのサイズを変更することを禁止します。しかし、これは長期的な計画ではない。
このような変化の需要に対して、Qtはもう一つの機構――配置――を提供してこの問題を解決します。コンポーネントをあるレイアウトに入れると、レイアウトは専門のレイアウトマネージャによって管理されます。サイズや位置の調整が必要な場合、Qtは対応するレイアウトマネージャを用いて調整します。
信号と溝のconnect
Qt 4方式:マクロ
//Qt4:
/* 1*/ static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
/* 2*/ QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
Qt 5方式:関数ポインタ
// Qt5:
/* 3*/ static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
/* 4*/ static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
/* 5*/ static QMetaObject :: Connection QObject :: connect(const QObject * sender, const QMetaMethod&signal,const QObject * receiver, const QMetaMethod& method,Qt :: ConnectionType type = Qt :: AutoConnection)
connect 5番目のパラメータtype:信号と溝の関連付けを指定するために、信号が直ちに溝に送られるか、それとも後の時間に並んで転送を待つかを決めました。関連方式はエニュメレーションQtを使用しています。:Connection Typeで説明します。以下はその値と意味です。
列挙
値
説明
Qt:AutoConnection
0
*(自動関連、標準値)。受信者が送信信号のスレッド中にいる場合(すなわち信号とスロットが同じスレッド内にある)は、Qt:DirectConnectionを使用する。そうでなければ、Qt:QueueuedConnectionを使用する。信号が送信されるとき、どの関連タイプが使用されるかが決定される。
Qt:DirectConnection
1
直接的に関連する。信号が送信されると、直ちにスロットを呼び出します。スロットが実行された後に、送信信号の後のコード(つまり、emitキーの後のコード)が実行されます。このスロットは信号スレッドで実行されます。
Qt::QueueuedConnection
2
キュー関連。コントロールが受信者スレッドのイベントサイクルに戻ると、スロットが呼び出されます。つまり、emitキーの後のコードは直ちに実行されます。スロットは後で実行されます。このスロットは、受信者のスレッドで実行されます。
Qt::Blocking QueuedConnection
3
列の関連をブロックします。Qt::QueueuedConnectionと同じですが、信号スレッドは溝が戻るまでブロックされます。受信者が信号スレッド内にいると、この接続は使えません。そうでないとアプリケーションはロックされます。
Qt:UniqueConnection
0 x 80
一意の関連これは、ビット単位または上記の任意の接続タイプとの組み合わせを使用することができるフラグである。Qt::UniqueConnectionを設定すると、重複しない場合のみ接続が行われ、重複接続が既に存在している場合(すなわち、同じ信号は同じオブジェクト上の完全に同じ溝を指す)、接続が失敗し、無効なQMetaObjectが返されます。
例
// 1
A ma; B mb;
QObject::connect (&ma, SIGNAL( s(int) ), &mb, SLOT(x(int) );
// 2
A ma; B mb;
mb.connect(&ma, SIGNAL(s(int)), SLOT(x(int));
// 3
A ma; B mb;
QObject::connect(&ma, &A::s, &mb, &B::x );
// 4
A ma;
QObject::connect(&ma, &A::s, &B::x); // void x(int i) B
// 5
A ma; B mb;
int indexSig = ma.metaObject()->indexOfSignal("clicked(bool)");
int indexSlot = mb.metaObject()->indexOfSlot("close()");
connect(&ma, ma.metaObject()->method(indexSig), &mb, mb.metaObject()->method(indexSlot));
追加:
/* 1*/ static bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
/* 2*/ static bool QObject::disconnect(const QMetaObject::Connection &connection)
/* 3*/ static bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject*receiver, PointerToMemberFunction method)
/* 4*/ static bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject*receiver, const QMetaMethod &method)
/* 5*/ bool QObject::disconnect(const char *signal = Q_NULLPTR, const QObject *receiver = Q_NULLPTR, const char *method = Q_NULLPTR) const
/* 6*/ bool QObject::disconnect(const QObject *receiver, const char *method = Q_NULLPTR) const
追加: