在qt c ++中连续更新值

时间:2016-11-21 18:18:12

标签: c++ qt

我在QT有一个LCDNumber显示面板。我想用从外部伺服电机接收的变量(速度)连续更新它的值

我有以下代码

HANDLE RS232Handle;
UCHAR Address = 0;
UCHAR Status = 0;
int Value = 0;
GetResult(RS232Handle, &Address, &Status, &Value);
printf("Result: Address=%d, Status=%d, Value=%d\n", Address, Status, Value);
ui->lcdNumber_TarRot_Status->display(Value);

必须运行所有这些行才能获得正确的值。我已经研究过每隔x秒调用一个函数,并且我已经尝试了一个永远运行的for循环,但没有任何实际工作符合要求。有没有正确的方法呢?

谢谢!

3 个答案:

答案 0 :(得分:3)

我不知道你是怎么试图“每隔x秒调用一个函数” - 很可能你曾经使用阻塞等待这样做。相反,从计时器调用它,而不阻塞事件循环。

class MyClass : public QWidget {
  Q_OBJECT
  Ui::MyClass ui;
  HANDLE m_device = 0;
  QBasicTimer m_queryTimer;
  void timerEvent(QTimerEvent *event) override {
    if (event->timerId() == m_queryTimer.timerId())
      queryDevice();
  }
  void queryDevice() {
      UCHAR address = 0;
      UCHAR status = 0;
      int value = 0;
      GetResult(m_device, &address, &status, &value);
qDebug() << "Result: Address" << address << "Status" << status << "Value" << value;
      ui->lcdNumber_TarRot_Status->display(value);
    }
  }
  ...
public:
  explicit MyClass(QObject *parent = nullptr) : QObject(parent) {
    ui.setupUi(this);
    m_queryTimer.start(1000, this);
    ...
  }
  void openDevice() {
    ...
    m_device = ...;
  }
};

答案 1 :(得分:1)

我最终使用了QTimer,因为我正在使用QT:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
  QTimer *timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), this, SLOT(updateMCvalues()));
  timer->start();
}
void MainWindow::updateMCvalues() {
  HANDLE RS232Handle;
  UCHAR Address = 0;
  UCHAR Status = 0;
  int Value = 0;
  GetResult(RS232Handle, &Address, &Status, &Value);
  printf("Result: Address=%d, Status=%d, Value=%d\n", Address, Status, Value);
  ui->lcdNumber_TarRot_Status->display(Value);
}

答案 2 :(得分:-1)

来自QLCDNumber类的Qt文档。 display()是一个广告位,而不是公共函数。除非在UI线程,否则直接调用它将无效See here for info on signals and slots if you are unfamiliar.

正确的用法是connect你选择的信号(即你自己的)到````display()```slot。

假设您连接到output_number广告位后发出了一个名为display()的信号。你可以打电话:

emit output_number(Value);

这将调用Qt UI线程上的显示槽。