返回

Qt使用匿名函数

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

1. connect中使用
  • connect中可以使用匿名函数代替槽函数进行一些简单操作。
  • 原型
//connect to a functor
template 
static inline typename std::enable_if::ArgumentCount == -1, QMetaObject::Connection>::type
        connect(const typename QtPrivate::FunctionPointer::Object *sender, Func1 signal, Func2 slot)
{
    return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection);
}
  • 示例
QPushButton *button = new QPushButton;
connect(button, &QPushButton::clicked, [this]() {
    ...
});
2. 排序使用
  • 原型
template 
QT_DEPRECATED_X("Use std::sort") inline void qSort(RandomAccessIterator start, RandomAccessIterator end, LessThan lessThan)
{
    if (start != end)
        QAlgorithmsPrivate::qSortHelper(start, end, *start, lessThan);
}
  • 使用
QList list{3, 1, 2};
qSort(list.begin(), 
      list.end(), 
      [](int left, int right)->bool {
        return left < right;
      }
     );
3. 高级线程中使用
  • QtConcurrent命名空间中的run接口支持匿名函数,用起来简直爽得不要不要的。
  • 原型
template 
QFuture run(T (*functionPointer)())
{
    return (new StoredFunctorCall0(functionPointer))->start();
}
  • 使用
QtConcurrent::run([=](){
    ...
});
4. 定时器中使用
  • QTimer的singleShot也支持匿名函数,用起来直观明了。
  • 原型
void singleShot(int msec, Functor functor)
  • 使用
QTimer::singleShot(1000, [](){
    qDebug()<<"Finished!!!";
});
5. 与QVariant结合使用
  • 这个功能基本不会用到,楞是要找出一个用法可以看下Qt君往期推送的Qt网络开源库系列篇中有用到。
Q_DECLARE_METATYPE(std::function)

int main(int argc, char *argv[]) 
{
    std::function f = [](){ qDebug()<<"22"; };
    QVariant var = QVariant::fromValue(f);
    if (var.canConvert >()) {
        std::function func = var.value>();
        func();
    }
}
6. std::for_each
  • 原型
template
Function for_each(InputIterator first, InputIterator last, Function fn)
{
    while (first!=last) {
        fn (*first);
        ++first;
    }
    return fn;      // or, since C++11: return move(fn);
}
  • 示例
QList list{1, 2, 3};
std::for_each(list.begin(), 
              list.end(), 
              [](int i) { 
                  ...
              });

相关知识