Kann man in einem Thread auf ein Edit-Feld zugreifen?

Alles rund um die Programmierung mit Qt
Frezee
Beiträge: 8
Registriert: 30. November 2009 18:31

Beitrag von Frezee »

franzf hat geschrieben:*** HUST HUST ***
Da ist ein neuer Thread ja so was von Overkill...
Ein normaler QTimer reicht. Du kannst dir auch das timerEvent() mal anschauen...
Hmm su hast Recht.. ^^

Ich bin jetzt auf die Funktion startTimer gestoßen und wollte die auch gleich in mein Programm einbauen:

Code: Alles auswählen

ui->timeEdit->startTimer(1000);

Das Programm wird dann auch ohne Error kompiliert. Aber wenn man dann den Button drückt, der eigentlich den Countdown starten sollte wird zwar alles ausgeführt aber das timeEdit beginnt trotzdem keinen Countdown. :(

Habe ich irgendwas falschgemacht :?:

Vielleicht wisst ihr ja Hilfe.. :wink:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du darfst dir aber auch die Doku durchlesen...
QObject::startTimer() hat geschrieben:Starts a timer and returns a timer identifier, or returns zero if it could not start a timer.

A timer event will occur every interval milliseconds until killTimer() is called. If interval is 0, then the timer event occurs once every time there are no more window system events to process.

The virtual timerEvent() function is called with the QTimerEvent event parameter class when a timer event occurs. Reimplement this function to get timer events.
Du musst also in der Klasse selber das timerEvent() implementieren und den timer starten, in der du was mit dem Event anfangen willst! Bei dir ist das mit ziemlicher Sicherheit die MainWindow-Klasse. Oder halt die Klasse, die die Gui-Elemente hält, SIGNALS/SLOTS dieser conneted, usw.
Frezee
Beiträge: 8
Registriert: 30. November 2009 18:31

Beitrag von Frezee »

franzf hat geschrieben:Du darfst dir aber auch die Doku durchlesen...
QObject::startTimer() hat geschrieben:Starts a timer and returns a timer identifier, or returns zero if it could not start a timer.

A timer event will occur every interval milliseconds until killTimer() is called. If interval is 0, then the timer event occurs once every time there are no more window system events to process.

The virtual timerEvent() function is called with the QTimerEvent event parameter class when a timer event occurs. Reimplement this function to get timer events.
Du musst also in der Klasse selber das timerEvent() implementieren und den timer starten, in der du was mit dem Event anfangen willst! Bei dir ist das mit ziemlicher Sicherheit die MainWindow-Klasse. Oder halt die Klasse, die die Gui-Elemente hält, SIGNALS/SLOTS dieser conneted, usw.
Ich glaube ich bin einfach zu blöd dafür.. Ich schaff das einfach nicht die Klasse zu implementieren und im ganzen Inet gibts anscheinend kein Beispiel dafür.. :cry:
Wenn jemand Lust hat, kann er ja vielleicht ein kurzes Beispiel dazu machen... (:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Naja, hier ein einfaches Beispiel mit nem QTimer ohne timerEvent().
Wenn du willst kann ich dir auch dazu noch ein Beispiel posten.

Code: Alles auswählen

#ifndef WIDGET1_H
#define WIDGET1_H

#include <QPushButton>
#include <QTimer>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QSpinBox>
#include <QLabel>

const int defaultTimer = 13;

class Widget1 : public QWidget
{
    Q_OBJECT
    QTimer* timer;
    QPushButton* startPauseBtn;
    QSpinBox* timeSpin;
    QLabel* countDownLbl;
    bool paused;
    int time;
public:
    Widget1()
     : time(defaultTimer)
    {
        timer = new QTimer(this);
        timer->setInterval(1000);
        startPauseBtn = new QPushButton("Start Timer", this);
        countDownLbl = new QLabel(this);
        countDownLbl->setText(QString::number(defaultTimer));
        timeSpin = new QSpinBox(this);
        timeSpin->setValue(defaultTimer);

        QPushButton* stopBtn = new QPushButton("Stop Timer", this);

        QHBoxLayout* viewLayout = new QHBoxLayout;
        viewLayout->addWidget(timeSpin);
        viewLayout->addWidget(countDownLbl);

        QHBoxLayout* btnLayout = new QHBoxLayout;
        btnLayout->addWidget(startPauseBtn);
        btnLayout->addWidget(stopBtn);

        QVBoxLayout* mainLayout = new QVBoxLayout(this);
        mainLayout->addLayout(viewLayout);
        mainLayout->addLayout(btnLayout);

        connect(startPauseBtn, SIGNAL(clicked()), SLOT(startPause()));
        connect(stopBtn, SIGNAL(clicked()), SLOT(stopTimer()));

        connect(timer, SIGNAL(timeout()), SLOT(updateCountDown()));
    }
public slots:
    void startPause()
    {
        if(timer->isActive())
        {
            timer->stop();
            startPauseBtn->setText("Start Timer");
            paused = true;
        } else {
            if(!paused) {
                time = timeSpin->value();
                countDownLbl->setText(QString::number(time));
            }
            timer->start();
            startPauseBtn->setText("Pause Timer");
        }
    }
    void stopTimer()
    {
        timer->stop();
        startPauseBtn->setText("Start Timer");
        paused = false;
    }

    void updateCountDown()
    {
        time --;
        countDownLbl->setText(QString::number(time));
    }
};

#endif
main.cpp:

Code: Alles auswählen

#include <QApplication>
#include "widget_timer.h"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget1 w;
    w.show();
    return app.exec();
}
Antworten