qt信号与槽代替postevent

【转帖请注明出处:blog.youkuaiyun.com/lanmanck】

用了qthread后,自然想起给gui线程发送数据。

qt4中,QCustomEvent已经不使用了。因为qthread是从QObject继承的,所以可以使用signal,slot机制来通信。

1、在线程定义signal:

class aa:public QThread

{

Q_OBJECT

...

signals:

 void sendData(char*p,int len);

}

然后在线程的cpp里面发射此信号:

emit sendData(buf,124);

注意:不需要实现此函数,因为此函数被连接到下面的slot了。

2、在gui线程,或者别的线程里面建立slot来接受此信号:

头文件:

class MyGUIClass:public QMainWindow

{

private slot:

  void receiveData(char*p,int len);

}

cpp文件:

在构造函数里先connect:

aa1 = new aa();

connect(aa1,SIGNAL(sendData(char*p,int len)),this,SLOT(receiveData(char*p,int len));

然后实现这个接收函数:

void MyGUIClass:receiveData(char*p,int len)

{

//

}

构建过程有点罗嗦,没有mfc简单。

注意:定义signals后,要加上Q_OBJECT,并且要make distclean.否则连接的时候提示找不到那个signal函数

### 静态函数发出信号的解决方案 在 Qt 中,`signals` 是类的一部分,并通过 `QObject` 的机制实现。由于静态方法不属于任何特定的对象实例,因此它们本身无法直接发射信号[^1]。 然而,可以通过以下几种方式间接实现这一需求: #### 方法一:创建一个全局对象来管理信号 可以定义一个继承自 `QObject` 的单例类,在该类中声明并连接所需的信号。这样,即使调用的是静态方法,也可以让这个全局对象负责实际的信号发射工作。 ```cpp class SignalManager : public QObject { Q_OBJECT public: static SignalManager* instance(); signals: void finished(int result); private: explicit SignalManager(QObject *parent = nullptr); }; // 实现单例模式 SignalManager* SignalManager::instance() { static SignalManager manager; return &manager; } void SomeClass::staticFunction() { int result = performSomeOperation(); // 假设这是要执行的操作 SignalManager::instance()->emit finished(result); // 发射信号 } ``` 这种方法利用了一个独立于具体业务逻辑之外的信号管理者。 #### 方法二:使用事件代替信号 如果目标仅仅是通知某些组件发生了某个动作,则可以考虑改用事件的方式替代传统意义上的信号传递[^4]。例如,当需要从静态上下文中广播消息时,可构造相应的 `QEvent` 并将其发送给感兴趣的目标对象。 ```cpp class CustomEvent : public QEvent { public: static const Type eventType; CustomEvent(int value) : QEvent(eventType), m_value(value) {} int getValue() const { return m_value; } private: int m_value; }; const QEvent::Type CustomEvent::eventType = static_cast<QEvent::Type>(QEvent::registerEventType()); void SomeClass::staticFunction() { int dataToPass = computeData(); QApplication::postEvent(targetObject, new CustomEvent(dataToPass)); } ``` 此方案避免了直接依赖于非局部化的信号体系结构的同时保留了跨模块通信的能力。 #### 方法三:借助线程安全队列异步处理任务 对于多线程环境下的场景,还可以采用生产者消费者模型设计思路——即由静态成员函数作为生产方将待完成的任务放入共享容器;而另一个长期运行的工作线程则扮演消费角色不断取出这些请求进而触发关联的动作响应链路。 --- ### 总结 虽然严格意义上讲,QtSignals 和 Slots 不支持直接应用于 Static Function 上面,但是上述三种策略均提供了有效的变通手段以满足类似的开发诉求[^2]. ```python # Python 示例展示如何模拟类似行为(仅作概念说明) from threading import Thread, Queue class Worker(Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): while True: task = self.queue.get() if task is None: break process_task(task) task_queue = Queue() def static_function(): payload = generate_payload() task_queue.put(payload) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值