【问题标题】:Cannot connect QFileSystemWatcher::directoryChanged to a lambda无法将 QFileSystemWatcher::directoryChanged 连接到 lambda
【发布时间】:2017-12-27 22:56:40
【问题描述】:

正如标题所说,我正在尝试将QFileSystemWatcher::directoryChanged(const QString&) 信号连接到一个 lambda,但是当我使用 g++ (7.2.1) 编译它时,我收到以下错误(缩写,因为 SO 不会让我发布太多代码):

g++ -c -pipe -O2 -std=gnu++1y -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -isystem /usr/include/libdrm -I/usr/lib64/qt5/mkspecs/linux-g++ -o foo.o foo.cpp
foo.cpp: In function ‘int main()’:
foo.cpp:10:55: error: no matching function for call to ‘QObject::connect(QFileSystemWatcher (&)(), void (QFileSystemWatcher::*)(const QString&, QFileSystemWatcher::QPrivateSignal), main()::<lambda(const QString&)>)’
                      [] (const QString&) { return 0; });

我正在使用 Qt 5.9 进行编译。任何想法为什么会发生这种情况? AFAICT 我正在使用的 lambda 很好。这是我的 MWE:

foo.cpp:

#include <QObject>
#include <QFileSystemWatcher>

int main()
{
    QFileSystemWatcher watcher();
    QObject::connect(watcher, &QFileSystemWatcher::directoryChanged,
                     [] (const QString&) { return 0; });
}

foo.pro:

######################################################################
# Automatically generated by qmake (3.1) Thu Dec 28 11:11:15 2017
######################################################################

TEMPLATE = app
TARGET = foo
INCLUDEPATH += .
CONFIG += c++14
DEFINES += QT_DEPRECATED_WARNINGS

# Input
SOURCES += foo.cpp

【问题讨论】:

  • QFileSystemWatcher::QPrivateSignal 似乎可疑?
  • QObject::connect(watcher, &amp;QFileSystemWatcher::directoryChanged, [] (const QString&amp;) { return 0; }); 更改为QObject::connect(&amp;watcher, &amp;QFileSystemWatcher::directoryChanged, [] (const QString&amp;) { return 0; });

标签: c++ qt lambda qt-signals qfilesystemwatcher


【解决方案1】:

检查 Qt 5.9 API 声明的第一个参数的类型,它必须是指向 QObject 派生对象的指针。

connect(const QObject *sender, PointerToMemberFunction 信号, Functor 函子)

【讨论】:

  • 正确的说法应该是:QObject::connect(&amp;watcher, &amp;QFileSystemWatcher::directoryChanged, [] (const QString&amp;) { return 0; });
  • 呸,菜鸟的错误:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2020-03-31
  • 1970-01-01
  • 2021-06-10
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多