1.コンセプト:
信号( Signal )就是在特定情况下被发射的事件 , 例如 PushButton 最常见的信号就是鼠标单
击时发射的 clicked() 信号。
槽( Slot )就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分( public 、 private 或 protected ),可以具有任何参数,也可以被直接调用。
槽函数与一般的函数不同的是 :槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行 。
Qt のメタオブジェクト コンパイラ (MOC) は、ソース プログラムがコンパイルされる前にこれらの Qt 機能プログラムを標準 C++ 互換形式に変換し、その後標準 C++ コンパイラでコンパイルするプリプロセッサです。このため、シグナルおよびスロットのメカニズムを使用するクラスに Q_OBJECT マクロを追加する必要があります。このマクロを追加するだけで、クラス内のシグナルおよびスロット コードを moc 前処理できます。
シグナルとスロットの使用に関しては、注意すべきルールがいくつかあります。
(1) 信号は複数のスロットに接続できます。
connect (spinNum, SIGNAL(valueChanged(int)), this , SLOT(addFun(int)) ;
connect (spinNum, SIGNAL(valueChanged (int)), this , SLOT(updateStatus (int));
シグナル関数やスロット関数にパラメータがある場合、connect()関数内にパラメータの型を記述する必要がありますが、パラメータ名を記述する必要はありません。
(2) 複数の信号を同じスロットに接続できます。
connect (ui->rBtnBlue , SIGNAL (clicked()) , this, SLOT (setTextFontColor ()));
connect (ui->rBtnRed , SIGNAL (clicked()) , this , SLOT (setTextFontColor ())) ;
connect (ui->rBtnBlack , SIGNAL (clicked()), this , SLOT (setTextFontColor ()));
(3) 信号は別の信号に接続できます。
connect (spinNum, SIGNAL(valueChanged (int)), this , SIGNAL (refreshinfo(int)) ;
(4) 厳密に言えば、信号とスロットのパラメータの数と種類は一致している必要があり、少なくとも信号のパラメータがスロットのパラメータ未満であってはなりません
。一致しない場合はコンパイルエラーまたは実行時エラーが発生します。
(5) シグナルやスロットを使用するクラスでは、クラス定義にマクロ QOBJECT を追加する必要があります。
(6) シグナルが発行されると、通常、関数への通常の呼び出しと同様に、それに関連付けられたスロット関数が即座に実行されます。
シグナルに関連付けられたすべてのスロット関数が実行された後でのみ、シグナルに続くコードが実行されます。
class QMyClass : public QObject
{
QOBJECT//引用信号与槽时候,必须引用
public:
//构造函数
Widget(QWidget *parent = nullptr);
//析构函数
~Widget();
private:
//
protected:
//
private slots:
//
}
2. connect() 関数のさまざまなパラメータ形式:
(1)一种参数形式的函数原型是:
connect(sender , SIGNAL(signal()), , receiver, SLOT (slot())) ;
特徴: ここではマクロ SIGNAL() と SLOT() を使用してシグナル関数とスロット関数を指定します。シグナル関数とスロット関数にパラメーターがある場合は、パラメーターのタイプも指定する必要があります。
connect (sender , SIGNAL(valueChanged (int)), this , SLOT(updateStatus (int) );
(2)另外一种参数形式的函数的原型是 :
適用可能なオブジェクト: デフォルト パラメーターを持つ信号とスロット (つまり、信号名は一意であり、異なるパラメーターを持つ同じ名前を持つ 2 つの信号はありません) の場合、次のようなこの関数ポインター フォームを使用して関連付けることができます。
connect (lineEdit,&QlineEdit::textChanged ,this, &widget::on_textChanged);
(3)易错点:
而对于具有不同参数的同名信号就不能采用函数指针的方式进行信号与槽的关联,例如QSpinBox() 有两个 valueChanged()信号 :
在这里插入图片描述