0


我正在尝试使用 QT 创建一个定期回调。我在想,类似于 OpenGL 的周期性回调。

基本上,我有一个正在等待事件发生的微控制器。当事件发生时,它通过串行端口将时间发送到 PC。在 PC 端,我希望 GUI 在收到此时间信息时更新,或者定期检查 Rx 缓冲区中是否有任何内容。

  • Qt 是否有任何内置功能可以定期调用方法?
  • 如果没有,有没有办法在 QextSerial 和 GUI 之间创建信号?
  • 或者,我是否必须制作一个在serialPort 和GUI 之间具有观察者/可观察关系的多线程应用程序?
  • 4

    3 回答 3

    3

    看看QTimer。他们还列出了一个模拟时钟的例子

    于 2012-11-17T17:35:46.230 回答
    1

    对于我的特定需求,我最终使用了 QextSerialPort。

    我在端口上附加了一个信号,这样每当收到消息时,它就会将时间添加到模型中,并更新 GUI。

    Port = new QextSerialPort();
    //... various Port Setup
    connect(Port, SIGNAL(readyRead()),      this, SLOT(onReadyRead()));
    

    通过这种方式,我能够使数据模型和 GUI 更加分离。

    于 2012-11-17T20:34:13.487 回答
    1

    您可以尝试使用 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);
    }
    
    于 2012-11-19T13:28:46.917 回答