4

Qtは、ここに示すように、ファンクターパラメーターを使用してシグナルスロット接続でラムダ関数を使用できます。しかし、Qt接続でファンクターパラメーターを宣言する方法は?例えば、

QAction* CreateAction(QString text, QObject* parent, Functor functor)
{
    QAction* action = new QAction(icon, text, parent);
    QObject::connect(action, &QAction::triggered, functor);
    return action;
}

問題は、コンパイラに「ファンクター」タイプを知らせるためにファイルを含める方法です。

4

2 に答える 2

3

Functor実際のタイプではありません。Qtドキュメントのプレースホルダーです。実際の型はテンプレート型パラメータです。QObject.h本当に興味があるか確認してください。std::function実際には、で定義されているを代わりに使用できます<functional>

問題の関数の場合、最も簡単な変更は、テンプレート関数にすることです。

template<Functor>
QAction* CreateAction(QString text, QObject* parent, Functor&& functor)
{
    QAction* action = new QAction(icon, text, parent);
    QObject::connect(action, &QAction::triggered, std::forward<Functor>(functor));
    return action;
}
于 2013-03-16T16:05:47.613 に答える
-2

http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#connect-5

ファンクターは単なるavoid *またはvoidポインターです。静的である必要があるかもしれません。これは、通常のコールバック関数に似ているようです。

ドキュメントの例を次に示します。

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);
于 2013-03-16T16:06:24.337 に答える