QT 使类成员函数 回调函数 实现类似信号槽 记录回调使用情况

C++ 要想使成员函数 设成回调函数 ,查资料一般都把函数设成static 类型或什么友元函数。如果设成 static类型 涉及到UI界面更新的话,UI元素也要写成static 的  比较麻烦。

以前用信号槽更新界面内容,今天尝试用回调,总结了一下 步骤:

主界面有个函数如:

void MainWindow::recerve(QString str){ //用来更新界面,我想在其他线程或其他对象中使用这个函数来更新界面
      ui->lineEdit->setText(str);
}

首先用std::function设置函数类型void(QString)      再用std::bind 绑定要调用的类成员函数  如下

主程序代码

std::function<void(QString)> to_mail;
to_mail=std::bind(&MainWindow::recerve,this,std::placeholders::_1);

_rmc->setCallback(to_mail);//这句就是把这个函数指针变量传到想要使用的类_rmc中 然后那个类中就可以使用这个函数了  和传变量一样的道理 这个_rmc类中有个一样的类型的函数指针std::function<void(QString)>

绑定完后to_mail变量相当于指向MainWindow::recerve(QString str)的函数指针

然后再把这个函数指针变量传到想要使用的类中,即要使用这个函数的地方 一般人们都叫他回调    就是传个函数指针变量

到这里主程序代码就完成了

使用回调函数的类中代码:

头文件

public:
    std::function<void(QString)> m_callbackFunc;
    void setCallback(std::function<void(QString)>);

实现:

void ReadMailCode::setCallback(std::function<void(QString)> m_fun)
{
    m_callbackFunc=m_fun;
}

可以了 在这个类的对象中可以随便使用m_callbackFunc()函数了   就相当于使用 MainWindow::recerve(QString str)函数

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt 中,全局回调函数一般是指不属于任何对象的函数,它们通常被用于处理底层操作系统的事件,比如 Windows 消息循环中的回调函数。因为全局回调函数不属于任何对象,所以它们不能直接使用 Qt信号机制。 不过,你可以通过以下两种方式来在全局回调函数使用信号: 1. 使用全局变量来传递信号对象 你可以将信号对象保存为全局变量,然后在全局回调函数使用这些变量来发送和接收信号。这种方式需要注意线程安全问题,因为全局回调函数可能在多个线程中同时执行。 以下是一个简单的示例: ``` // 全局变量 QObject* g_signalSender = nullptr; QObject* g_signalReceiver = nullptr; // 初始化全局变量 void initGlobalObjects() { g_signalSender = new QObject(); g_signalReceiver = new QObject(); QObject::connect(g_signalSender, &QObject::destroyed, g_signalReceiver, &QObject::deleteLater); } // 全局回调函数 void globalCallbackFunction() { // 发送信号 emit g_signalSender->destroyed(); } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 初始化全局变量 initGlobalObjects(); // 连接信号 QObject::connect(g_signalSender, &QObject::destroyed, [](){ qDebug() << "Signal received"; }); // 调用全局回调函数 globalCallbackFunction(); return app.exec(); } ``` 在这个例子中,我们定义了两个全局变量 `g_signalSender` 和 `g_signalReceiver`,它们分别用于发送和接收信号。在 `initGlobalObjects` 函数中,我们初始化这些变量,并将它们连接起来。然后,在全局回调函数 `globalCallbackFunction` 中,我们发送了一个信号。最后,在主函数中,我们启动了 Qt 的事件循环,并调用了全局回调函数。 2. 使用 Qt 的事件系统 Qt 的事件系统可以让你在全局回调函数中发送和处理事件,这样就可以使用信号了。你可以通过以下步骤来实现: - 创建一个自定义事件类,并添加需要的员变量和函数。 - 在全局回调函数中创建一个事件对象,并调用 `QCoreApplication::postEvent` 函数将事件发送到事件队列中。 - 在 Qt 对象中重载 `QObject::customEvent` 函数,处理接收到的事件。 以下是一个简单的示例: ``` // 自定义事件类 class MyCustomEvent : public QEvent { public: explicit MyCustomEvent(int type, const QString& data) : QEvent(static_cast<QEvent::Type>(type)) , m_data(data) {} QString data() const { return m_data; } private: QString m_data; }; // 全局回调函数 void globalCallbackFunction() { // 创建事件对象 MyCustomEvent* event = new MyCustomEvent(QEvent::User, "Hello, world!"); // 发送事件 QCoreApplication::postEvent(qApp, event); } // Qt 对象 class MyObject : public QObject { Q_OBJECT public: explicit MyObject(QObject* parent = nullptr) : QObject(parent) {} protected: virtual void customEvent(QEvent *event) override { if (event->type() == QEvent::User) { MyCustomEvent* myEvent = static_cast<MyCustomEvent*>(event); qDebug() << "Received data:" << myEvent->data(); } } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 创建 MyObject 对象 MyObject myObject; // 调用全局回调函数 globalCallbackFunction(); return app.exec(); } ``` 在这个例子中,我们创建了一个名为 `MyCustomEvent` 的自定义事件类,并添加了一个员变量 `m_data`。在全局回调函数中,我们创建了一个 `MyCustomEvent` 对象,将其发送到事件队列中。然后,在 `MyObject` 类中,我们重载了 `QObject::customEvent` 函数,用于处理接收到的自定义事件。最后,在主函数中,我们创建了一个 `MyObject` 对象,并调用了全局回调函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liucun0505

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值