前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看看Qt里那些使用了匿名函数

看看Qt里那些使用了匿名函数

作者头像
Qt君
发布2019-07-25 17:06:09
8090
发布2019-07-25 17:06:09
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

匿名函数也可以被叫做Lambda表达式,自C++11中引入该特性。本文主要介绍Qt里使用到的匿名函数。

1. connect中使用

  • connect中可以使用匿名函数代替槽函数进行一些简单操作。
  • 原型
代码语言:javascript
复制
//connect to a functor
template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
        connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
{
    return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection);
}
  • 示例
代码语言:javascript
复制
QPushButton *button = new QPushButton;
connect(button, &QPushButton::clicked, [this]() {
    ...
});

2. 排序使用

  • 原型
代码语言:javascript
复制
template <typename RandomAccessIterator, typename LessThan>
QT_DEPRECATED_X("Use std::sort") inline void qSort(RandomAccessIterator start, RandomAccessIterator end, LessThan lessThan)
{
    if (start != end)
        QAlgorithmsPrivate::qSortHelper(start, end, *start, lessThan);
}
  • 使用
代码语言:javascript
复制
QList<int> list{3, 1, 2};
qSort(list.begin(), 
      list.end(), 
      [](int left, int right)->bool {
        return left < right;
      }
     );

3. 高级线程中使用

  • QtConcurrent命名空间中的run接口支持匿名函数,用起来简直爽得不要不要的。
  • 原型
代码语言:javascript
复制
template <typename T>
QFuture<T> run(T (*functionPointer)())
{
    return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start();
}
  • 使用
代码语言:javascript
复制
QtConcurrent::run([=](){
    ...
});

4. 定时器中使用

  • QTimer的singleShot也支持匿名函数,用起来直观明了。
  • 原型
代码语言:javascript
复制
void singleShot(int msec, Functor functor)
  • 使用
代码语言:javascript
复制
QTimer::singleShot(1000, [](){
    qDebug()<<"Finished!!!";
});

5. 与QVariant结合使用

  • 这个功能基本不会用到,楞是要找出一个用法可以看下Qt君往期推送的Qt网络开源库系列篇中有用到。
代码语言:javascript
复制
Q_DECLARE_METATYPE(std::function<void ()>)

int main(int argc, char *argv[]) 
{
    std::function<void ()> f = [](){ qDebug()<<"22"; };
    QVariant var = QVariant::fromValue(f);
    if (var.canConvert<std::function<void ()> >()) {
        std::function<void ()> func = var.value<std::function<void ()>>();
        func();
    }
}

6. std::for_each

  • 原型
代码语言:javascript
复制
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
    while (first!=last) {
        fn (*first);
        ++first;
    }
    return fn;      // or, since C++11: return move(fn);
}
  • 示例
代码语言:javascript
复制
QList<int> list{1, 2, 3};
std::for_each(list.begin(), 
              list.end(), 
              [](int i) { 
                  ...
              });

关于Qt中更多的匿名函数(Lambda表达式)写法也可以在留言区一起讨论

关于匿名函数(Lambda表达式)可点击:

这是一个函数[](){}

关于QVariant与匿名函数的使用可点击:

Qt开源网络库[5]-lambda支持

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. connect中使用
  • 2. 排序使用
  • 3. 高级线程中使用
  • 4. 定时器中使用
  • 5. 与QVariant结合使用
  • 6. std::for_each
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档