Qtフレームワークでは、イベント処理を完了するためにシグナルスロットメカニズムが使用されます。
シグナルは発生したイベントであり、スロットはイベントを処理する関数です。MFCのメッセージループメカニズムとは異なり、2つは一緒ではありません。それらは疎結合です。それらを接続するには、接続機能を使用して接続する必要があります。たとえば、達成したい場合、閉じるボタンをクリックすると、現在のウィンドウ操作が閉じます。次に、接続機能を使用して、「クリック」信号機能と「クローズ」スロット機能を接続する必要があります。
以下は私のコードです:
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QPushButton>
#include<QString>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(const int& x,const int& y,const QString& str,QWidget *parent = nullptr);
signals:
};
MyPushButton::MyPushButton(const int& x, const int& y,const QString& str,QWidget *parent) :QPushButton(parent)
{
this->setText(str);
this->move(x,y);
this->resize(100,50);
}
#endif // MYPUSHBUTTON_H
#include "widget.h"
#include"mypushbutton.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QString str = "关闭";
MyPushButton button(300,200,str);
button.setParent(&w);
//连接信号槽
QObject::connect(&button,&MyPushButton::clicked,&QApplication::quit);
button.show();
w.show();
return a.exec();
}
このコードの中心は、QObject :: connect()関数の使用にあります。ウィジェットクラスでQObjectを記述することによってのみ、シグナルスロットメカニズムを使用できます。したがって、connectはQObjectの関数メンバーです。ヘルプドキュメントで、connect関数に6つのオーバーロードされた関数があることがわかります。そのうちの5つは静的メンバー関数で、残りの1つは通常のメンバー関数です。以下は、この通常の接続関数のプロトタイプです。
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
この通常のメンバー関数はQObjectを使用して呼び出す必要がありますが、QObjectオブジェクトを作成する必要はないため、通常はオーバーロードされた5つの静的メンバー関数を使用します。
static QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
static QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
static QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
static QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
static QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
これらの接続関数をよく見ると、送信側と受信側がQObjectポインター型(つまり、QObjectオブジェクトまたはQObject派生クラスオブジェクトである可能性がある)であることがわかります。接続タイプのデフォルト値はQt :: AutoConnectionです。シグナルとスロットは、const char *タイプ、const QMetaMethod&タイプ、またはメンバー関数ポインター(PointerToMemberFunction)、またはFunctorタイプにすることができます。このタイプは、シグナルに接続できる任意の関数またはファンクターにすることができます。ラムダ式。
注意:Qt :: UniqueConnectionsは、ラムダ、非メンバー関数、ファンクターでは機能しません。メンバー関数への接続にのみ適用されます。
明らかに、静的関数の4番目の関数がコードで使用されています。
QObject::connect(&button,&MyPushButton::clicked,&QApplication::quit);
ボタンはシグナル送信者、クリックはシグナル、終了はスロット機能です。
ボタンをクリックしてシグナルを送信すると、スロット関数quitが呼び出され、プログラムが終了します。
ラムダ式については、こちらをご覧ください:https : //blog.csdn.net/zy010101/article/details/73613664
信号スロットでは、信号とスロットのパラメーターが同じである必要があります。整合性がない場合、スロット関数のパラメーターは信号のパラメーターよりも小さくなる可能性がありますが、それでもスロット関数のパラメーターの順序は、信号の以前のパラメーターと一致している必要があります。スロット関数の信号からのデータを無視することを選択できますが、信号にこのパラメーターがないとは言えないため、スロット関数で使用します。
通常使用する接続関数の形式は次のとおりです。
connect(sender, signal, receiver, slot);
送信者はシグナル送信者、シグナルはシグナル、受信者はシグナル受信者、そしてスロットはスロット機能です。
シグナルが送信されると、スロット関数が自動的に呼び出されます。