Не удается записать в Qt5 textEdit box с ui — >control — >>setText(сообщение)

Я пытаюсь передать данные в Главное окно.функция cpp на экране с типичным

ui->control->>setText(message) без успеха. Та же строка работает, если она находится в цикле таймера или функции кнопки, но не от display_that_data функции

«MainWindow:: display_that_data()» вызывается из myudp.cpp со следующими строками

    MainWindow show_tlm;
    show_tlm.display_that_data(data_source, buf_copy);

главное окно.cpp (обновлено, чтобы включить излучение сигнала для соединения сигнал / слот)
Соединение сигнал / слот настраивается в конструкторе со следующей строкой

    connect (this, SIGNAL (showdata_signal()), this, SLOT(showdata_slot()));



    void MainWindow::display_that_data(QByteArray data_source, QByteArray tlmBuf){
        QString msg ;
        msg = " in display_that_data";
        qDebug() << msg  ;
        ui->tlm_vals->setText(msg);
        //generate a signal which will trigger showdata_slot
        emit showdata_signal();
        msg = " in display_that_data after  emit showdata_signal()";
        qDebug() << msg  ;
    }

    void MainWindow::showdata_slot() {
        QString msg = "showdata_slot called";
        qDebug() << msg ;
        ui->tlm_vals->setText(msg);
    }

Сообщения отладки во время выполнения показывают, что код делает это в showdata_slot, но он все еще не пишет в ui — >tlm_vals

«in display_that_data»


«showdata_slot called»


«в display_that_data после эмиссии showdata_signal()»

но…. ни одна из строк пользовательского интерфейса->tlm_vals->>setText(msg) не помещает текст в пользовательский интерфейс


«MainWindow:: realtimeDataSlot ()» вызывается по сигналу timout по таймеру следующим образом:

    void MainWindow::setupRealtimeDataDemo(QCustomPlot *customPlot) {
        // setup a timer that repeatedly calls MainWindow::realtimeDataSlot
        connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
        dataTimer.start(1000); 
    }

    void MainWindow::realtimeDataSlot(){
        QString temp = QString("%1").arg(epochTime, 10,  10, QChar('0'));
        ui->tlm_vals->setText(temp);
    }

И это работает отлично (конечно, я должен отключить его, чтобы увидеть, если showdata_slot пишет в пользовательский интерфейс)

Я думал, что проблема была необходимым сигналом и соединением слота, чтобы вызвать запись в пользовательский интерфейс, но создание соединения сигнал / слот (который отладка показывает, как работает) все еще не пишет в пользовательский интерфейс из функции слота.

Для полноты главного окна.h содержит следующее

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void setupRealtimeDataDemo(QCustomPlot *customPlot);
        void display_that_data (QByteArray data_source, QByteArray tlmBuf);
    private slots:
        void realtimeDataSlot();
        void showdata_slot();
    private:
        Ui::MainWindow *ui;
        QTimer dataTimer;

Что я упускаю / делаю неправильно?

1 ответ

  1. Где-то глубоко внедрено в Qt есть разница между gui mouse click generated event и code generated event, и это каким-то образом предупреждает поведение Qt, чтобы отличаться от тех же строк кода. Я буду перепост более «корневого уровня» вопрос по этой теме.