我有兩個不同的類型QPushButton*
和vector<QString>
類型的Qt按鈕。每個按鈕都必須顯示一個消息框,其中顯示了矢量的最後一個元素的值,以及用戶是否按下了是向矢量中插入特定值。下面的代碼顯示了我如何做到這一點(QMessageBox::information
僅出於調試原因)。這裏是我的代碼的相關部分:更改幾個可變lambda表示相同的向量
std::vector<QString> myVector;
myVector.push_back("First value");
QObject::connect(button1,&QPushButton::clicked,myWidget,[myVector=move(myVector)]() mutable{
QMessageBox::information(NULL,"",std::to_string(myVector.size()).c_str());
if(QMessageBox::question(NULL,"","The value of the last element in the vector is " + myVector[myVector.size() - 1] + ".\nDo you want to insert a new value?",QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes){
myVector.push_back("Value inserted by button 1");
}
});
QObject::connect(button2,&QPushButton::clicked,myWidget,[myVector=move(myVector)]() mutable{
QMessageBox::information(NULL,"",std::to_string(myVector.size()).c_str());
if(QMessageBox::question(NULL,"","The value of the last element in the vector is " + myVector[myVector.size() - 1] + ".\nDo you want to insert a new value?",QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes){
myVector.push_back("Value inserted by button 2");
}
});
我確定矢量在任何時候都是空的。
當我按下按鈕1時,一切都按原樣運作。但是當我按下按鈕2時,消息框顯示矢量的大小爲0,我確信這不是真的。當我交換兩個QObject::connect
函數時,即將按鈕2的那個放在按鈕1的那個之前,按鈕的行爲交換:按鈕2正常工作,按鈕1認爲矢量是空的。
似乎並不是這是使兩個lambda捕獲與mutable相同的向量的正確方法。這是爲什麼?這樣做的正確方法是什麼?
你已經從同一個變量移動了兩次。想想那是什麼。 – NathanOliver
@NathanOliver好的,但是這樣做的正確方法是什麼?只使用lambda中的一個而不使用另一個lambdas就足夠了? –
爲什麼不在每個lambda中存儲對向量的引用,如果它們應該共享呢? – NathanOliver