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

本文解决了一个在QT派生类中调用系统close函数时与QWidget::close函数冲突的问题,通过使用全局域符号避免了误调用。同时,文章详细描述了问题现象、原因分析及解决方案,为遇到类似问题的开发者提供了参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

QT应用中使用ioctl功能进行系统调用,可以按照以下步骤进行: 1. **包含必要的头文件**: 确保在QT项目中包含了必要的头文件,如`<sys/ioctl.h>`、`<unistd.h>`等。 2. **打开设备文件**: 使用`open()`函数打开需要控制的设备文件。例如,如果要控制一个串口设备,可以使用类似以下的代码: ```cpp int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open_port: Unable to open /dev/ttyS0 - "); return 1; } ``` 3. **使用ioctl进行系统调用**: 使用`ioctl()`函数进行系统调用。例如,设置串口波特率: ```cpp struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); tcsetattr(fd, TCSANOW, &options); ``` 4. **关闭设备文件**: 使用`close()`函数关闭设备文件: ```cpp close(fd); ``` 以下是一个完整的示例代码,展示了如何在QT应用中使用ioctl进行系统调用来设置串口波特率: ```cpp #include <QCoreApplication> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <termios.h> #include <iostream> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open_port: Unable to open /dev/ttyS0 - "); return 1; } struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); tcsetattr(fd, TCSANOW, &options); std::cout << "Baud rate set to 115200" << std::endl; close(fd); return a.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值