我正在尝试使用 QT 创建一个定期回调。我在想,类似于 OpenGL 的周期性回调。
基本上,我有一个正在等待事件发生的微控制器。当事件发生时,它通过串行端口将时间发送到 PC。在 PC 端,我希望 GUI 在收到此时间信息时更新,或者定期检查 Rx 缓冲区中是否有任何内容。
我正在尝试使用 QT 创建一个定期回调。我在想,类似于 OpenGL 的周期性回调。
基本上,我有一个正在等待事件发生的微控制器。当事件发生时,它通过串行端口将时间发送到 PC。在 PC 端,我希望 GUI 在收到此时间信息时更新,或者定期检查 Rx 缓冲区中是否有任何内容。
对于我的特定需求,我最终使用了 QextSerialPort。
我在端口上附加了一个信号,这样每当收到消息时,它就会将时间添加到模型中,并更新 GUI。
Port = new QextSerialPort();
//... various Port Setup
connect(Port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
通过这种方式,我能够使数据模型和 GUI 更加分离。
您可以尝试使用 QSocketNotifier。
我用它来读取和处理标准输入。您只需要更改您从中读取的文件(在我的情况下为 STDIN_FILENO)
---hpp
class QSocketNotifier;
class ConsoleReader : public QObject
{
Q_OBJECT
public:
explicit ConsoleReader(QObject *parent = 0);
Q_SIGNALS:
void textReceived(QString message);
public Q_SLOTS:
void text();
private:
QSocketNotifier* notifier;
};
---cpp
#include <QSocketNotifier>
#include <unistd.h> //Provides STDIN_FILENO
ConsoleReader::ConsoleReader(QObject *parent)
: QObject(parent)
{
notifier = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(text()));
}
void ConsoleReader::text()
{
QTextStream qin(stdin);
QString line = qin.readLine();
Q_EMIT textReceived(line);
}