Seite 1 von 1

QSound::stop() und QTimer::stop() [solved - doku]

Verfasst: 24. Januar 2011 13:16
von PyCoder
Hi

Ich hab ein kleines Problem mit nem sehr einfachen "Wecker" und zwar Crasht mir "alert->stop()" und "alertTimer->stop()" das App und ich komm einfach nicht drauf wieso.


Da ich nicht so bewandert oder gut in C++ bin wollte ich mal fragen ob mir jemand sagen kann wieso ;)

Code: Alles auswählen

#include <QtGui>
#include "clock.h"
#include "ui_clock.h"
#include <QDebug>

Clock::Clock() {
    ui.setupUi(this);

    // Orginal Palette
    QPalette palette = ui.clockTime->palette();

    // Timer Objects
    QTimer* clockTimer = new QTimer(this);
    QTimer* alertTimer = new QTimer(this);
    alertTimer->setInterval(1000);

    // Singals and Slots
    connect(clockTimer, SIGNAL(timeout()), this, SLOT(showTime()));
    connect(alertTimer, SIGNAL(timeout()), this, SLOT(checkAlert()));
    connect(ui.buttonBox, SIGNAL(accepted()), alertTimer, SLOT(start()));
    connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(stopAlert()));

    clockTimer->start(1000);
    showTime();
}

void Clock::showTime() {
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");
    ui.clockTime->display(text);
}

void Clock::checkAlert() {
    qDebug() << "Armed!";
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm:ss");

    QPalette alertPalette = ui.clockTime->palette();
    alertPalette.setColor(QPalette::Normal, QPalette::Foreground, Qt::red);

    if (checkDay() && text == ui.alertTime->text()) {
        qDebug() << "ALERT";

        ui.clockTime->setPalette(alertPalette);
        playSound();
        }
}

void Clock::stopAlert() {
    alert->stop();
    alertTimer->stop();
    ui.clockTime->setPalette(palette);
}

void Clock::playSound() {
    //qDebug() << QSound::isAvailable();
    qDebug() << "playSound";
    QSound* alert = new QSound("bell.wav",this);
    //alert->setLoops(360);
    alert->play();
}

bool Clock::checkDay() {
    QDate day;
    //qDebug() << day.shortDayName(day.dayOfWeek());

    switch (day.dayOfWeek()) {

    case 1:
        if (ui.Mon->isChecked()) {
            return true;
        }

    case 2:
        if (ui.Tue->isChecked()) {
            return true;
        }

    case 3:
        if (ui.Wed->isChecked()) {
            return true;
        }
    case 4:
        if (ui.Thur->isChecked()) {
            return true;
        }

    case 5:
        if (ui.Fri->isChecked()) {
            return true;
        }

    case 6:
        if (ui.Sat->isChecked()) {
            return true;
        }

    case 7:
        if (ui.Sun->isChecked()) {
            return true;
        }

    default: return false;

    }
}

Code: Alles auswählen

#ifndef CLOCK_H
#define CLOCK_H
#include <ui_clock.h>
#include <QSound>

class Clock: public QDialog {
    Q_OBJECT
public:
    Clock();
    ~Clock() {};
private:
    Ui::Dialog ui;
    QTimer* alertTimer;
    QPalette palette;
    QSound* alert;
private slots:
    void showTime();
    bool checkDay();
    void checkAlert();
    void playSound();
    void stopAlert();

};

#endif // CLOCK_H

Re: QSound::stop() und QTimer::stop() crashen App!

Verfasst: 24. Januar 2011 13:20
von solarix
PyCoder hat geschrieben:Hi

Ich hab ein kleines Problem mit nem sehr einfachen "Wecker" und zwar Crasht mir "alert->stop()" und "alertTimer->stop()" das App und ich komm einfach nicht drauf wieso.
Worauf zeigt denn "alert" (leider nicht dorthin wo du denkst)?

Re: QSound::stop() und QTimer::stop() crashen App!

Verfasst: 24. Januar 2011 14:00
von PyCoder
solarix hat geschrieben:
PyCoder hat geschrieben:Hi

Ich hab ein kleines Problem mit nem sehr einfachen "Wecker" und zwar Crasht mir "alert->stop()" und "alertTimer->stop()" das App und ich komm einfach nicht drauf wieso.
Worauf zeigt denn "alert" (leider nicht dorthin wo du denkst)?
Ist doch korrekt? "QSound* alert = new QSound("bell.wav",this); "

Aber auch "alertTimer->stop()" lässt die App crashen...

Also hilft mir die spärchliche Info nicht viel weiter :/

Verfasst: 24. Januar 2011 14:06
von jerry42
Du musst die Gültigkeit deiner Variablen anschauen.
Im Konstruktor arbeitest Du mit einer lokalen Variablen und in den anderen Methoden mit den Membern.
Das heißt z.B. in der Methode "void Clock::stopAlert()"
ist alert gar nicht initialisiert.

Verfasst: 24. Januar 2011 14:35
von PyCoder
jerry42 hat geschrieben:Du musst die Gültigkeit deiner Variablen anschauen.
Im Konstruktor arbeitest Du mit einer lokalen Variablen und in den anderen Methoden mit den Membern.
Das heißt z.B. in der Methode "void Clock::stopAlert()"
ist alert gar nicht initialisiert.
Du meinst also this->alert->stop()?

Das funzt auch ned... Die App crasht...


Zeig mal bitte in funktionierendem Code :(

Verfasst: 24. Januar 2011 14:46
von jerry42
nein, wir meinen, dass du im Konstruktor, die Member Variable initialisieren sollst und nicht eine lokale Variable:

also nicht so:
// Timer Objects
QTimer* clockTimer = new QTimer(this);
QTimer* alertTimer = new QTimer(this);

sondern:
clockTimer = new QTimer(this);
alertTimer = new QTimer(this);

das gleiche mit alert in "void Clock::playSound()"

alert = new QSound("bell.wav",this);

Verfasst: 24. Januar 2011 15:12
von PyCoder
jerry42 hat geschrieben:nein, wir meinen, dass du im Konstruktor, die Member Variable initialisieren sollst und nicht eine lokale Variable:

Also ich hab jetzt den Code geändert auf:

Code: Alles auswählen

#ifndef CLOCK_H
#define CLOCK_H
#include <ui_clock.h>
#include <QSound>
#include <QTimer>

class Clock: public QDialog {
    Q_OBJECT
public:
    Clock();
    ~Clock() {};
private:
    Ui::Dialog ui;
    QTimer clockTimer;
    QTimer alertTimer;
    QPalette palette;
    QSound alert;
private slots:
    void showTime();
    bool checkDay();
    void checkAlert();
    void playSound();
    void stopAlert();

};

#endif // CLOCK_H

und

Code: Alles auswählen

    // Timer Objects
    clockTimer = new QTimer(this);
    alertTimer = new QTimer(this);
    //alertTimer->setInterval(1000);

und

Code: Alles auswählen

void Clock::playSound() {
    //qDebug() << QSound::isAvailable();
    alert = new QSound("bell.wav",this);
    qDebug() << "playSound";
    //alert->setLoops(360);
    //alert->play();
}
Jetzt erhalt ich nur noch Fehlermeldungen im qtcreator -.-'




Bild


Selbst das Beispiel von Qt funktioniert nicht -.-'

http://doc.trolltech.com/3.3/sound-example.html (Jaja, veraltet)

Verfasst: 24. Januar 2011 15:19
von Herzogswalder
Sorry, aber lerne bitte erstmal die C++-Grundlagen, bevor du mit Qt beginnst, denn Qt setzt solche Kentnisse voraus.

Verfasst: 24. Januar 2011 15:24
von PyCoder
Herzogswalder hat geschrieben:Sorry, aber lerne bitte erstmal die C++-Grundlagen, bevor du mit Qt beginnst, denn Qt setzt solche Kentnisse voraus.
Sorry, Qt ist nicht das Problem denn ich komm von PyQt...


Das Problem ist das sogar die Dokumentation fehlerhaft und mangelhaft ist!

Einzige Beispiel: http://doc.trolltech.com/3.3/sound-example.html

Dort werden die Klassenmember auch nicht als Zeiger deklariert und so hab ichs halt auch gemacht...

War wohl der Fehler...



Aufjedenfall gehts jetzt...

Danke an jerry42

Verfasst: 24. Januar 2011 16:06
von Christian81
Das ist Qt3 und außerdem sind das statische Funktionen die da aufgerufen werden... - nix mit new ...