我在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循环,但没有任何实际工作符合要求。有没有正确的方法呢?
谢谢!
答案 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线程上的显示槽。