Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Qtwidget: Text ausgeben



  • Hallo,
    ich habe in der Vergangenheit schon sehr gute Tipps bekommen.
    Nun stehe ich vor dem Problem, dass ich mit QtCreator ein Widget erstellt habe.
    Jertzt möchte ich Messwerte, die von meiner Application ermittelt werden im Widget ausgeben.
    Dazu habe ich einige Fragen:

    1. Welches Item muß dafür erstellt werden (qlabel?)?
    2. Wie kann ich das per Programm verändern? Goto Slot?

    Vielen Dank für hilfreiche Tipps.
    Gruß


  • Lifetime Qt Champion

    @K-Str

    1. Für Text gibt es Widgets in Qt (QTextEdit, QPlainTextEdit), QLabel kann auch benutzt werden.
    2. Die Frage ist nicht klar. Um Text zu setzen haben die oben genannten Widgets Methoden (wie setText()). Diese Methoden sind Slots und können somit mit Signalen verbunden werden. Oder man schreibt eigene Slots und ruft diese Methoden dort auf.


  • @jsulm ,
    Danks für Deine Antwort.
    Ich benutze den QT-Creator 4.8.2 mit Qt 5.11.3 auf einem Raspberry PI3.
    Ich verwende QLabel.
    Da wird mir aber Element und keine Methode mit ui->.. angeboten.
    Für die Codeeingabe ui-> kommt aber der Hinweis:

    invalid use of member 'ui' in static member funktion
    expected unqualified-id
    

    Es sollten mir aber alle Elemente die ich modifizieren kann angeboten werden.
    Mach ich da was falsch?


  • Lifetime Qt Champion

    @K-Str "invalid use of member 'ui' in static member funktion" - ui ist nicht statisch und kann somit nicht in statischen Methoden benutzt werden. Kannst du zeigen was du eigentlich versuchst zu machen?



  • @jsulm ,
    danke für Deine Antwort.
    In meiner Applikation habe ich einen Timer eingerichtet, der jede Sekunde Messwerte von einem Sensor ausliest.
    Dann sollen die Sensordaten in einem Label im Widget ausgegeben werden.
    Hier die Codes:
    main.cpp

    #include "mainwindow.h"
    #include <time.h>
    #include <QApplication>
    #include <iostream>
    #include <unistd.h>
    #include <math.h>
    #include "adxl345class.h"
    #include <signal.h>
    #include <stdlib.h>
    
    using namespace std;
    timer_t SensorTimer;
    timer_t MotorTimer;
    static int count1 = 0;
    static int count2 = 0;
    struct sigaction sa;
    
    Adxl345Class adxl;
    
    
    
    /* Timer erzeugen und starten
     * Timerid: die zurueckgegebene ID des Timers
     * sek: Wartezeit Sekundenanteil
     * msek: Wartezeit Millisekundenanteil
     */
    void start_timer(timer_t *Timerid, int sek, int msek)
      {
      struct itimerspec timer;
    
      timer.it_value.tv_sec = sek;
      timer.it_value.tv_nsec = msek * 1000000;
      timer.it_interval.tv_sec = sek;
      timer.it_interval.tv_nsec = msek * 1000000;
    
      timer_create (CLOCK_REALTIME, NULL, Timerid);
      timer_settime (*Timerid, 0, &timer, NULL);
      printf("Timer gestartet, ID: 0x%lx\n", (long) *Timerid);
      }
    
    /* Signalhandler für alle Timer
     * Unterscheidung der Timer anhand von tidp
     */
    void timer_callback(int sig, siginfo_t *si, void *uc)
      {
      timer_t *tidp;
       tidp = &si->si_value.sival_ptr;
      if (*tidp == SensorTimer)
        adxl.readADXL345();
        MainWindow::SensordatenAnzeigen();
        //    cout << "X = " << adxl.rx << "; Y = " << adxl.ry << "; Z = " << adxl.rz << endl;
      if (*tidp == MotorTimer)
        printf(", Count 2: %d\n",count2++);
      }
    
    void TimerInit(void)
    {
    /* cllback-Handler installieren */
        memset(&sa, 0, sizeof (sa));
        sa.sa_flags = SA_SIGINFO;
        sa.sa_sigaction = timer_callback;
        sigemptyset(&sa.sa_mask);
        if (sigaction(SIGALRM, &sa, NULL) == -1)
        perror("sigaction");
    
    /* timer starten */
        start_timer(&SensorTimer,1,0);
        start_timer(&MotorTimer,0,500);
    }
    
    int main(int argc, char *argv[])
    {
        TimerInit();
        QApplication a(argc, argv);
        MainWindow w;
        w.showFullScreen();
        adxl.initADXL345();
    
        return a.exec();
    }
    

    mainwindow.cpp:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::SensordatenAnzeigen()
    {
        ui->ValDatum->setText("Datum!");
    }
    
    void MainWindow::on_EinAusButton_clicked()
    {
        qDebug() << "Ein/Aus gedrueckt";
    }
    
    void MainWindow::on_MotAnAusButton_clicked()
    {
        qDebug() << "Motor An/Aus gedrueckt";
    }
    

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        void SensordatenAnzeigen(void);
    
    private slots:
        void on_EinAusButton_clicked();
    
        void on_MotAnAusButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    
    

    Wenn ich das module SensordatenAnzeigen() so definiere, dann bekomme ich eine Fehler
    *error: cannot call member function ‘void MainWindow::SensordatenAnzeigen()’ without object
    wenn ich es in main.cpp aufrufe.
    Wenn ich es in mainwindow.h als

    static void SensordatenAnzeigen()
    

    definiere, dann bekomme ich den beschriebenen Fehler.
    Ich weis da hebe ich einiges durcheinander gebracht.


  • Lifetime Qt Champion

    @K-Str Übergebe einfach einen Zeiger auf MainWindow an timer_callback.
    Außerdem hat Qt QTimer...



  • @jsulm ,
    danke für Deinen Tipp.
    Letztendlich habe ich es mit QTimer hingekriegt.
    Super Hilfe!!!


Log in to reply