2017-09-25 89 views
1

在Qt 5.9中,我試圖用C++關鍵字代替SLOT。這是可能的(沒有一個單獨的方法)?在連接信號/插槽中使用C++關鍵字

喜歡的東西:

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(); 
+3

使用拉姆達。 https://artandlogic.com/2013/09/qt-5-and-c11-lambdas-are-your-friend/ – drescherjm

+1

雖然說這看起來很危險。我的意思是如果併發執行仍在運行,你釋放圖像壞事會發生.. – drescherjm

回答

1

您可以使用lambda表達式相反(更多關於新的連接語法here)。

考慮到接收器在這些示例中是slot的其他所有者(如果使用舊語法),它不是全局變量或宏。另外,使用lambda表達式時,您無法訪問sender()方法,因此您必須通過其他方法處理訪問它們。要解決這些情況,你必須在lambda中捕獲這些變量。就你而言,它只是指針。

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

是的,它按需工作,謝謝! –

3

lambda表達式:

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