QObject :: connect中Func2类型的参数?

时间:2013-07-03 13:55:08

标签: c++ qt function-pointers qt5 signals-slots

QObject::connect采用如下参数:

connect(const QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
        const QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot);

现在假设我正在创建方法QPushButton *newPushButton(const QString &text, Func2 slot);,如何使用Func2作为参数的类型,我是否必须包含某些内容?

以下是我希望newPushButton看起来如何的示例:

QPushButton *MyWidget::newPushButton(const QString &text, Func2 slot)
{
    QPushButton *pushButton = new QPushButton(text);
    layout->addWidget(pushButton);
    QObject::connect(pushButton, &QPushButton::clicked,
                     this, slot);
    return pushButton;
}

现在我可以这样称呼它:

MyWidget::MyWidget(QWidget *parent = 0) : QWidget(parent)
{
    layout = new QVBoxLayout;
    myButton1 = newPushButton("My Button One", &MyWidget::on_myButton1_clicked);
    myButton2 = newPushButton("My Button Two", &MyWidget::on_myButton2_clicked);
    setLayout(layout);
}

但是,我似乎无法弄清楚如何在不使用模板的情况下将&MyWidget::slot作为参数传递给newPushButton()方法(connect()如何做?)。

layoutmyButton都是MyWidget的成员。

2 个答案:

答案 0 :(得分:2)

  

但是,我似乎无法弄清楚如何在不使用模板的情况下将&amp; MyWidget :: slot作为参数传递给newPushButton()方法(connect()如何做到这一点?)。

我没理解 - 那些connect()重载使用模板:http://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobject.h.html#212

难道你不能这样做吗?

template<typename Func2> 
QPushButton *MyWidget::newPushButton(const QString &text, Func2 slot)
{
    QPushButton *pushButton = new QPushButton(text);
    layout->addWidget(pushButton);
    QObject::connect(pushButton, &QPushButton::clicked,
                     this, slot);
    return pushButton;
}

答案 1 :(得分:0)

由于您使用的信号为clicked()(没有bool类型的参数?),因此类型为void(*)(),因此您只需将Func2 slot替换为void(*slot)() {1}}:

QPushButton *MyWidget::newPushButton(const QString &text, void(*slot)())
{
    QPushButton *pushButton = new QPushButton(text);
    layout->addWidget(pushButton);
    QObject::connect(pushButton, &QPushButton::clicked,
                     this, slot);
    return pushButton;
}