qt 应用程序中使用 close系统调用函数 注意有关问题

qt 应用程序中使用 close系统调用函数 注意问题

因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界面没有了,并成为僵尸线程了。这个问题我找了一天多,最后总算找到了。在此做下记录,希望也能给遇到同样问题的朋友提供参考吧。