2016-11-21 3 views
0

У меня есть панель дисплея LCDNumber в QT. Я хочу, чтобы изменить значение этого непрерывно с переменным принимаются от внешнего серводвигателя (скорость)Обновление значения непрерывно в qt C++

У меня есть следующий код

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

Является ли этот код работает в основном потоке? вы не должны обновлять графический интерфейс из потока, отличного от потока графического интерфейса. – Mike

+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

Из документов Qt класса QLCDNumber. display() - это слот, а не публичная функция. Вызов его напрямую не будет работать , если только в пользовательском интерфейсе. See here for info on signals and slots if you are unfamiliar.

Правильное использование будет connect сигнала по вашему выбору (т. Е. Сделать свой собственный) в слот `` `` `display()` ``.

Скажите, что вы сделали сигнал под названием output_number, после подключения к разъему display(). Вы можете позвонить:

emit output_number(Value); 

Это, в свою очередь, вызовет слот дисплея на резьбе Qt UI.

+0

display() отлично работает с отображением цифр в классе LCDNumber. Это постоянно обновляется, что является проблемой. – Scientized

+0

@ Ученый понимал. Не могли бы вы обновить вопрос, чтобы это отразить? Неясно, что ваша проблема не связана с изменением пользовательского интерфейса. – mascoj

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); 
} 
Смежные вопросы