刚接触Qt, 请问signal可以将函数指针作为参数吗?

刚接触Qt, 请问signal可以将函数指针作为参数吗?

阅读 3.2k
3 个回答

在Qt中,signal可以将函数指针作为参数,但是不推荐。
因为SIGNAL和SLOT是宏,编译时会将信号函数和槽函数用字符串替换,并且不会判断参数是否相互匹配。

可以,用 lambda 包一下

myobject.h:

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <functional>

class MyObject : public QObject {
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = nullptr);

    void someFunction();

signals:
    void mySignal(const std::function<void()> &func);

public slots:
    void mySlot(const std::function<void()> &func);
};

#endif // MYOBJECT_H

myobject.cpp:

#include "myobject.h"
#include <QDebug>

MyObject::MyObject(QObject *parent) : QObject(parent) {
    connect(this, &MyObject::mySignal, this, &MyObject::mySlot);
}

void MyObject::someFunction() {
    qDebug() << "This is someFunction.";
}

void MyObject::mySlot(const std::function<void()> &func) {
    func();
}

main.cpp:

#include <QCoreApplication>
#include "myobject.h"
#include <functional>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    MyObject obj;
    std::function<void()> boundFunction = std::bind(&MyObject::someFunction, &obj);
    emit obj.mySignal(boundFunction);
    emit obj.mySignal([&obj] { obj.someFunction(); });

    return app.exec();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏