我有一個功能,可以檢測3D切片機中的相機端口,但它似乎只運行一次。當我拔出/插入攝像頭時,端口數量應該在組合框(用Qt設計)中更新,但沒有任何變化。用C++刷新組合框?
功能我用檢測被點擊的相機端口時:
void qSlicerTrackingModuleWidget::onCameraPortClicked(){
Q_D(qSlicerTrackingModuleWidget);
// Clear current entries
d->CameraPortComboBox->clear();
int n = 0;
// Loop over camera ports until last one is found. Add all available ports to combo box and exit.
while(1){
cv::VideoCapture cap = cv::VideoCapture(n);
if(!cap.isOpened()){
return;
}
QString portNum = QString::fromStdString(std::to_string(n++));
d->CameraPortComboBox->addItem(portNum);
qSlicerCoreApplication::processEvents();
}
}
的設置功能,跑最後一棒,並分配GUI的實際功能。
connect(d->CameraPortComboBox, SIGNAL(clicked()), this, SLOT(onCameraPortClicked()));
我需要它來刷新,想盡組合框上點擊時檢測到相機,但由於接口設置的,我不知道這是否是可能的。我不認爲不斷刷新該計劃是一個不錯的選擇,所以我沒有想法。有沒有辦法做到這一點?
哎呀。你可以寫「QString portNum = QString :: number(n ++);」沒有std :: string中介,fwiw。 –
感謝您的提示,但你確定有沒有辦法可以做到這一點? – Mia
我認爲每次單擊它時刷新組合是可以的,但您需要在單獨的線程中執行檢測,然後在檢測完成後更新組合。爲了您自己的利益,請考慮'processEvents'調用是個bug。當初學者使用它們時,它們幾乎總是有缺陷。哎呀,我有一個60k行的交互式代碼庫,沒有一個'processEvents'和'waitFor ...'調用,並且只有'exec'調用用於主事件循環和'QDrag',不幸的是它是不必要的。 –