はじめに: 私は最近 QT を学び、シグナルとスロットを使用するときにシグナルとスロット関数のオーバーロードの問題に遭遇しました。学習して理解した後、それを解決する次の方法を見つけました。
QT の connect 関数の式:
QT4 以下のバージョン:
QObject:: connect(const QObject *送信者,const char *信号,const QObject *受信者,const char *メソッド,QT::ConnectionType type=Qt::Auto)
例: connect() 関数を使用して、ボタンの clicked() シグナル関数とウィジェット ウィンドウの close() スロット関数を関連付けます。実装コードは次のとおりです。
connect(&But,SIGNAL(clicked()),&widget,SLOT(close()));
注:文字ベースのマッチング
QT5以降
QObject::connect(const QObject *送信者、PointerToMemberFunction シグナル、const QObject *受信者、PointerToMemberFunction メソッド、Qt::ConnectionType タイプ = Qt::AutoConnection)
たとえば、新しい connect() 関数を使用して、ボタンの clicked() シグナル関数とウィジェット ウィンドウの close() スロット関数を関連付けます。実装コードは次のとおりです。
connect(&But, &QPushButton::clicked, &widget, &QWidget::close);
注: メソッドアドレスに基づくマッチング
シグナルまたはスロット機能が過負荷になった場合
1. QT4 形式を直接使用でき、関数はその式形式で明確に使用されており、オーバーロードによるあいまいさはありません。
2. QT5 以降の式の場合、次の 2 つの方法を使用して問題を解決できます。
a. static_cast を使用して、対応する信号またはスロット関数の型変換を強制します。
構文形式: static_cast <type-id>(expression)
たとえば、connect 関数を使用して、タイマーの timeout() 関数を MainWindow ウィンドウの update() スロット関数に関連付けます。
connect(&timer,&QTimer::timeout,&MainWindow,static_cast<void (MainWindow::*)()>(&QMainWindow::update));
b. 関数ポインタ形式を使用して実装します。
たとえば、connect 関数を使用して、タイマーの timeout() 関数を MainWindow ウィンドウの update() スロット関数に関連付けます。
void (MainWindow::*update_01)()=&QMainWindow::update;connect ( & timer , & QTimer :: timeout , & MainWindow , update_01 );
注:上記は個人的な学習と理解に基づいていますので、修正や交換は歓迎です。