Qt 應用程式中使用 close系統呼叫函式 注意問題
阿新 • • 發佈:2019-01-24
因qt QWidget有QWidget::close()函式,與系統呼叫函式close同名,這是qt設計不好的地方,因此在QWidget派生類函式中呼叫close系統呼叫就要使用全域性域符號“::”。
當時我出問題的程式碼如下:
void ButtonWindow::mousePressEvent ( QMouseEvent * e )//滑鼠單擊事件響應
{
int i;
int bfd;
int rt;
std::cout << "mouse clicked!\n";
bfd = open("/dev/Buzzer", 0);
if (bfd!=-1)
printf("open '/dev/Buzzer success!'\n");
else
{
printf("open '/dev/Buzzer fail!'\n");
printf(strerror(errno));
return;
}
rt = close(bfd); //注意此處使用錯誤,未加全域性域符號,預設呼叫ButtonWindow::close函式,應改為rt=::close(bfd)
printf("close:rt=%d\n", rt);
printf("close '/dev/Buzzer'!\n");
}
當時發現很奇怪,close函式總是返回1,與標準close函式返回值不符,且呼叫此句函式後,qt執行緒變為了殭屍執行緒。後來猛然發現qt QWidget有QWidget::close()函式,這也就能解釋為什麼qt介面沒有了,併成為殭屍執行緒了。這個問題我找了一天多,最後總算找到了。在此做下記錄,希望也能給遇到同樣問題的朋友提供參考吧。