在连接信号/插槽中使用C ++关键字

时间:2017-09-25 17:59:50

标签: c++ qt slot

在Qt 5.9中,我试图用C ++关键字代替SLOT。这是可能的(没有单独的方法)吗?

类似的东西:

QObject::connect(&timer, SIGNAL(timeout()),  this, (delete image_ptr));

这不起作用,在我的代码示例下面:

QImage *image_ptr = new QImage(3, 3, QImage::Format_Indexed8);
QEventLoop evt;
QFutureWatcher<QString> watcher;
QTimer timer(this);
timer.setSingleShot(true);
QObject::connect(&watcher, &QFutureWatcher<QString>::finished, &evt, &QEventLoop::quit);
QObject::connect(&timer, SIGNAL(timeout()), &watcher, SLOT(cancel()));
QObject::connect(&timer, SIGNAL(timeout()),  &evt, SLOT(quit));
QObject::connect(&timer, SIGNAL(timeout()),  this, (delete image_ptr));
QFuture<QString> future = QtConcurrent::run(this,&myClass::myMethod,*image_ptr);
watcher.setFuture(future);
timer.start(100);
evt.exec();

2 个答案:

答案 0 :(得分:3)

连接样本中的lambda表达式:

connect(
    sender, &Sender::valueChanged,
    [=]( const QString &newValue ) { receiver->updateValue( "senderValue", newValue ); }
);

答案 1 :(得分:1)

您可以使用lambda表达式(更多关于新的连接语法here)。

考虑到这些示例中的 receiver 是插槽的其他所有者(如果使用旧语法),它不是全局变量或宏。此外,使用lambdas时,您无法访问sender()方法,因此您必须通过其他方法来访问它们。要解决这些情况,您必须在lambda中捕获这些变量。在你的情况下,它只是指针。

QObject::connect(&timer, &QTimer::timeout, [&image_ptr]() { delete image_ptr; });