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

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

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

Beitrag 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
Zuletzt geändert von PyCoder am 24. Januar 2011 15:32, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

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

Beitrag 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)?
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

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

Beitrag 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 :/
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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.
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag 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 :(
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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);
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag 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)
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Beitrag von Herzogswalder »

Sorry, aber lerne bitte erstmal die C++-Grundlagen, bevor du mit Qt beginnst, denn Qt setzt solche Kentnisse voraus.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist Qt3 und außerdem sind das statische Funktionen die da aufgerufen werden... - nix mit new ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten