カレーqtスロットの方法はありますか?たぶんカレーに似たものがありますか?
4 に答える
Qt を直接使用することはできませんが、一部のバインディング/カリー化はLibQxtを介して利用できます。たとえば、QxtBoundFunctionのドキュメントから:
予想される最も一般的な使用法は、シグナルにパラメーターがない場合にスロットにパラメーターを提供することです。Qt を初めて使用する開発者の多くは、次のようなコードを書こうとします: \code connect(button, SIGNAL(clicked()), lineEdit, SLOT(setText("Hello, world"))); \endcode 経験豊富な Qt 開発者は、ここの欠陥にすぐに気付くでしょう。一般的な解決策は、目的の関数を呼び出す短い 1 行のラッパー スロットを作成することです。一部の賢い開発者は、QSignalMapper を使用して、1 つの int または QString パラメータのみを必要とするスロットを処理することさえできます。
QxtBoundFunction を使用すると、前の connect ステートメントを次のように記述できます: \code connect(button, SIGNAL(clicked()), QxtMetaObject::bind(lineEdit, SLOT(setText(QString))), Q_ARG(QString, "Hello, world!" ))); \code これは、定数値を渡すためだけに、新しいスロットを作成したり、さらに悪いことにオブジェクト全体を作成したりすることなく、同じ結果を達成します。
さらに、QXT_BIND マクロを使用することで、シグナルからのパラメーターを再配置、スキップ、または Q_ARG マクロで提供される定数引数と一緒に渡すことができます。これは、たとえば、ジェネリック関数にステートフルなコールバックを提供するために使用できます。
多くの種類の関数をバインドできます。最も一般的なバインディングは Qt シグナルとスロットに適用されますが、標準の C/C++ 関数も同様にバインドできます。将来の開発では、C++ メンバー関数にバインドする機能が追加される可能性があり、開発者は、必要に応じてさらに柔軟性を高めるためにカスタム QxtBoundFunction サブクラスを作成できます。
いくつかのパッチを LibQxt に提出しましたが、これを直接使用したわけではないので、マイレージは異なる場合があります。
Qtシグナル/スロットを使用して引数をバインドすることはできません。このような機能を実現するには、代わりにboost::signalsとboost::bindを使用する必要があります。
QSignalMapperを使用して、いくつかの信号をバインド接続してから、いくつかのパラメーターを付加して、QSignalMapper自体の信号をターゲットスロットに接続できます。
// connect signal to mapper
signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button1, QString("param1"));
signalMapper->setMapping(button2, QString("param2"));
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map()));
// connect mapper signal to slot
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &)));