QT下 QSocketNotifier 类的使用

转载 2013年12月02日 11:08:26

QSocketNotifier 用来监听系统文件操作,将操作转换为Qt事件进入系统的消息循环队列。并调用预先设置的事件接受函数,处理事件。

一共存在3类事件:read,write,exception.

     
QSocketNotifier::Read 0 There is data to be read.
QSocketNotifier::Write 1 Data can be written.
QSocketNotifier::Exception 2 An exception has occurred. We recommend against using this.

每个QSocketNotifie对象只能监听一个事件,如果要同时监听两个以上事件必须创建两个以上的监听对象。

QSocketNotifier::QSocketNotifier ( int socket, Type type, QObject * parent = 0 );

 

下面将说明如何使用 QSocketNotifier 来监听串口数据:
在使用 open 方法打开串口并设置好属性后,可以使用 Qt 的类 QSocketNotifier 来监听串口是否有数
据可读,它是事件驱动的, 配合 Qt 的 signal/slot 机制,当有数据可读时,QSocketNotifier 就会发射
ativated 信号,你只需要创建一个 slot 连接到该信号即可,代码如下所示:
m_fd = openSerialPort();
if (m_fd < 0)

{
      QMessageBox::warning(this, tr("Error"), tr("Fail to open serial port!"));
     return ;
}
m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));


在上述代码中,我们首先使用上面封装的 openSerialPort 函数打开串口并配置串口属性,接着我们
用 m_fd 和 QSocketNotifier::Read 作为参数构造了一个 QSocketNotifier 的实例,
QSocketNotifier::Read 参数表示我们需要关心串口的可读状态,最后将 QSocketNotifier 实例的
activated 信号连接到 remoteDataIncoming slot,当有数据可读时,remoteDataIncoming slot 会被调
用。
下面是 remoteDataIncoming slot 的代码,它的代码比较简单,只是调用 read 函数读取串口数据,
然后将数据显示到界面上:
void TMainForm::remoteDataIncoming()
{
char c;
if (read(m_fd, &c, sizeof c) != 1) {
QMessageBox::warning(this, tr("Error"), tr("Receive error!"));
return;
}
m_receiveEdit->insert(QString(QChar(c)));

}

QSocketNotifier的本质是监听驱动数据,所以驱动要实现poll函数,实现阻塞才可以,这是个人的理解。

Qt控制台输入输出实现exe间通信

包含 #include 输出到控制台 QString str = tr("Im cld"); QTextStream out(stdout); out str 中文...
  • yh_1988
  • yh_1988
  • 2017年05月16日 17:13
  • 275

Qt开发:释放线程中创建的QUdpSocket对象

在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻...
  • laiqun_ai
  • laiqun_ai
  • 2014年05月09日 10:06
  • 3958

QT中解决QSocketNotifier: socket notifiers cannot be enabled from another thread错误

class UDPReceive : public QThread { Q_OBJECT public: UDPReceive(); UDPReceive(QUdpSocket...
  • VictoryKNight
  • VictoryKNight
  • 2012年07月31日 18:10
  • 9732

QT中的QSOCKET编程

以下是用QT实现的利用SOCKET编程的例子,两端分别定时向对方放松hello串.h文件 /******************************************************...
  • xiehuin
  • xiehuin
  • 2008年03月07日 20:23
  • 4326

Qt 多线程编程中的对象线程与函数执行线程

近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in...
  • xzh_blue
  • xzh_blue
  • 2015年09月11日 15:46
  • 742

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

跨线程使用socket的问题
  • tony2278
  • tony2278
  • 2017年10月06日 14:54
  • 404

QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框

QMessageBox类: 含有Question消息框、Information消息框、Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的...
  • u013007900
  • u013007900
  • 2015年01月28日 09:53
  • 2019

QSocketNotifier丢数据

1,遇到这个问题 用QSocketNotifier监测串口读取数据 http://bbs.embedsky.net/forum.php?mod=viewthread&tid=9066...
  • kangear
  • kangear
  • 2012年10月06日 14:55
  • 1385

QSocketNotifier使用在Uart上

之前做了一个QSocketNotifier监听键盘事件响应的例子,这次当项目最后需要用到uart的时候,如果应用定时器读写的话,会出现网友如下的问题:         Q;我搜到的帖子里面说...
  • alada007
  • alada007
  • 2012年08月17日 09:52
  • 2727

QSocketNotifier 实现文件监控(demo Linux系统U盘插拔监控)

QSocketNotifier 类提供了对文件的监控活动的支持。 QSocketNotifier 类使Qt的事件循环和文件描述器的事件循环结合起来成为可能。文件描述器的动作可以被Qt的主事件循环( Q...
  • penghuilater
  • penghuilater
  • 2016年12月01日 09:49
  • 1309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT下 QSocketNotifier 类的使用
举报原因:
原因补充:

(最多只允许输入30个字)