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)));
}