Qt4里面 QThreadPool 里面无法接受主线程发来的信号吗?

李嘉图mTONG 2016-03-24 12:57:08
我现在想点击主线程中的一个按钮,然后才让线程池开始工作,线程池工作完后告诉我们,有木有办法实现?但似乎继承自QRunnable的类定义了槽也不能用,有木有办法实现?
...全文
269 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ibm123 2016-03-26
  • 打赏
  • 举报
回复
简单点就是将接收对象传参给QRunnable的继承类, 在run里,直接调用接收类的slot: QMetaObject::invokeMethod(receiver, "slotFinished", Qt::DirectConnection, //Qt::QueuedConnection Q_ARG(int, result) );
foruok 2016-03-25
  • 打赏
  • 举报
回复
qt4里的线程池,没有启动消息循环吧,加了QObject也不可用。
GreenArrowMan 2016-03-25
  • 打赏
  • 举报
回复
继承QRunnable的类,同时继承QObject然后在类中添加Q_OBJECT。试试吧
ksjxqy 2016-03-24
  • 打赏
  • 举报
回复
不光Qt4,Qt5也是这样的。QRunnable的定义是:

class Q_CORE_EXPORT QRunnable
{
    int ref;

    friend class QThreadPool;
    friend class QThreadPoolPrivate;
    friend class QThreadPoolThread;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
    Q_DISABLE_COPY(QRunnable)
#endif
public:
    virtual void run() = 0;

    QRunnable() : ref(0) { }
    virtual ~QRunnable();

    bool autoDelete() const { return ref != -1; }
    void setAutoDelete(bool _autoDelete) { ref = _autoDelete ? 0 : -1; }
};
QRunnable不是QObject的子类,所以自身无法使用signal/slot。但是你可以定义其它的辅助类继承QObject来实现。

21,480

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧