[gelöst] Fehler nach Auslagerung der QWizardPages

Verschiedenes zu Qt
Antworten
crossfader
Beiträge: 31
Registriert: 18. September 2010 21:21
Wohnort: Lengerich
Kontaktdaten:

[gelöst] Fehler nach Auslagerung der QWizardPages

Beitrag von crossfader »

Hallo!

Ich würde gerne erneut eure Hilfe beanspruchen..Ich bin gerade dabei einen kleinen Wizard (so etwas wie einen erweiterten Online Installer) zu programmieren. Ich war auch so gut wie fertig - hatte 3 Dateien (1x main und dann meine Klasse), die jedoch so aufgebaut waren wie der einfache License Wizard der Beispiele:

Code: Alles auswählen

//...
this->addPage(createIntroPage());
//...
Ich habe dann aber gemerkt, dass es für etwas größere Projekte mit Ereignisverarbeitung sinnvoller ist, die QWizardPages in externe Klassen auszulagern - wie im ClassWizard!

Nachdem ich meine Klassen gemacht habe (Beispiel):

Code: Alles auswählen

// --- Intro Seite des Wizards ---
class IntroPage : public QWizardPage
{
    Q_OBJECT

public:
    IntroPage(QWidget *parent = 0);

protected:
    QLabel *labelWelcome;
    QLabel *labelDescription;
    QLabel *labelWarning;
    QVBoxLayout *layout;
};
und sie mit

Code: Alles auswählen

this->addPage(new IntroPage);
eingebunden habe (in meiner "Hauptdatei"), ging gar nichts mehr.. Compiler meckert:

Bild

(wfxlivery.cpp -> QWizard Klasse)

Wieso ist mein neu erstelltes IntroPage Objekt plötzilch ein Integer?! Ich bin seit Stunden am verzweifeln..

Ach ja: Eingebunden habe ich die pages so:

Code: Alles auswählen

#include "pages.h"
Sollte also richtig sein.

Gruß,
Olli
Zuletzt geändert von crossfader am 16. September 2011 16:33, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Fehler nach Auslagerung der QWizardPages

Beitrag von Christian81 »

Und wie immer: minimal kompilierbareses Beispiel ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
crossfader
Beiträge: 31
Registriert: 18. September 2010 21:21
Wohnort: Lengerich
Kontaktdaten:

Re: Fehler nach Auslagerung der QWizardPages

Beitrag von crossfader »

Na toll.. ich dachte, wenn ich zu viel poste bekomme ich einen drüber - jetzt habe ich zu wenig :D

Ich werde die Quelltexte gleich hochladen!
crossfader
Beiträge: 31
Registriert: 18. September 2010 21:21
Wohnort: Lengerich
Kontaktdaten:

Re: Fehler nach Auslagerung der QWizardPages

Beitrag von crossfader »

So..

hier erstmal das komplette Projekt als .zip Datei:
http://dl.dropbox.com/u/9260599/wfxLivery.zip

Dann habe ich 4 Dateien (pages.cpp/.h -> enthält die einzelnen QWizardPages und wfxlivery.cpp/.h -> enthält die QWizard)

wfxlivery.h

Code: Alles auswählen

#ifndef WFXLIVERY_H
#define WFXLIVERY_H

#include <QWizard>
#include <QPixmap>
#include <QDebug>
#include <QSettings>
#include <QFile>
#include <QProgressBar>

#include "pages.h"

class wfxLivery : public QWizard
{
    Q_OBJECT

public:
    wfxLivery(QWidget *parent = 0);

public slots:
    void buttonClicked(int id);

private:
    QByteArray downloadFile(const QString &url);
    void act_GetLiveryInformation();
    void act_selectLivery();

    const char *serverUrl;
    QFile f_liverys;
    QSettings liverys;
    QProgressBar *bar;

    enum pageId {
        IntroPage               =   0,
        FsSelection             =   1,
        GetLiveryInformation    =   2,
        LiverySelection         =   3,
    };


};

#endif // WFXLIVERY_H

wfxlivery.cpp

Code: Alles auswählen

#include <QtGui>
#include <QtNetwork>
#include <QTemporaryFile>

#include "wfxlivery.h"

wfxLivery::wfxLivery(QWidget *parent)
    : QWizard(parent)
{
    this->serverUrl = "..";

    // --- Fenstertitel setzen ---
    setWindowTitle(QObject::tr("Westfalia Express Livery Installer"));

    // --- Bilder / Style setzen ---
     setPixmap(QWizard::WatermarkPixmap, QPixmap(":/orange.png"));
     setWizardStyle(QWizard::ModernStyle);

     // --- Optionen setzen ---
     setOption(QWizard::HaveHelpButton, false);
     setOption(QWizard::HaveCustomButton1, true);
     setOption(QWizard::NoBackButtonOnLastPage, true);

     // --- Buttontexte setzen ---
     setButtonText(QWizard::NextButton, QObject::tr("Weiter"));
     setButtonText(QWizard::FinishButton, QObject::tr("Beenden"));
     setButtonText(QWizard::BackButton, QObject::tr("Zurück"));
     setButtonText(QWizard::CancelButton, QObject::tr("Abbrechen"));
     setButtonText(QWizard::CustomButton1, QObject::tr("Webseite besuchen"));

     // --- Seiten hinzufügen ---
     addPage(new IntroPage);

     // --- Signal/Slot Verbindungen ---
     connect(this, SIGNAL(customButtonClicked(int)), this, SLOT(buttonClicked(int)));
}

void wfxLivery::buttonClicked(int id)
{
    if(id == 6) {
        QDesktopServices::openUrl(QUrl("http://www.westfalia-express.de"));
    }
}

void wfxLivery::act_GetLiveryInformation()
{
    //Datei herunterladen
    QByteArray t_data;
    t_data = downloadFile(QString("%1/liverys.ini").arg(this->serverUrl));

    //Daten in Datei schreiben
    QFile f_liverys(qApp->applicationDirPath() + "/data/liverys.ini");
    if(f_liverys.open(QIODevice::ReadWrite)) {
        f_liverys.write(t_data);
        f_liverys.flush();
    } else {
        // Datei konnte nicht geöffnet werden
        QMessageBox::critical(this, "Fehler",
                              "Die Daten konnte nicht empfangen werden, bitte führen Sie das Programm als Administrator aus!", QMessageBox::Ok);
        qApp->quit();
    }

    f_liverys.close();

    this->next();
}

//Dateidownload
QByteArray wfxLivery::downloadFile(const QString &url)
{
    QNetworkAccessManager networkManager;
    QNetworkReply *reply = networkManager.get(QNetworkRequest(QUrl(url)));
    QEventLoop loop;
        connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

    QByteArray data = reply->readAll();

    delete reply;

    return data;
}

pages.h

Code: Alles auswählen

#ifndef PAGES_H
#define PAGES_H

#include <QWizard>
#include <QtGui>

// --- Intro Seite des Wizards ---
class IntroPage : public QWizardPage
{
    Q_OBJECT

public:
    IntroPage(QWidget *parent = 0);

protected:
    QLabel *labelWelcome;
    QLabel *labelDescription;
    QLabel *labelWarning;
    QVBoxLayout *layout;
};

// --- Auswahl des Flugsimulators ---
class FsSelection : public QWizardPage
{
    Q_OBJECT

public:
    FsSelection(QWidget *parent = 0);

protected:
     QLabel *label;
     QRadioButton *fs9;
     QRadioButton *fsx;
     QVBoxLayout *layout;
};

// --- Download der verfügbaren Liverys ---
class GetLiveryInformation : public QWizardPage
{
    Q_OBJECT

public:
    GetLiveryInformation(QWidget *parent = 0);

protected:
    QLabel *label;
    QVBoxLayout *layout;
};

// --- Auswahl einer Livery, welche heruntergeladen werden soll ---
class LiverySelection : public QWizardPage
{
    Q_OBJECT

public:
    LiverySelection(QWidget *parent = 0);

protected:
    QLabel *label;
    QListWidget *liverys;
    QStringList liverysList;
    QVBoxLayout *layout;
};

#endif

pages.cpp

Code: Alles auswählen


#include "pages.h"

//                      //
//  ### Intro Seite ### //
//                      //

IntroPage::IntroPage(QWidget *parent)
    : QWizardPage(parent)
{
    setTitle(QObject::tr("Westfalia Express Livery Installer"));

    QLabel *labelWelcome = new QLabel(QObject::tr("Herzlich Willkommen im Westfalia Express va Livery installer!"));
    QLabel *labelDescription = new QLabel(QObject::tr("<br />Dieser Assistent wird die Westfalia Express va Liverys für Sie herunterladen und installieren.<br />"));
    QLabel *labelWarning = new QLabel(QObject::tr("<b>Wichtig:</b> Eine Internetverbindung ist zwingend erforderlich, um die Liverys herunterzuladen!"));

    labelWelcome->setWordWrap(true);
    labelDescription->setWordWrap(true);
    labelWarning->setWordWrap(true);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(labelWelcome);
    layout->addWidget(labelDescription);
    layout->addWidget(labelWarning);
    setLayout(layout);
}

//                      //
//  ### FS Auswahl ###  //
//                      //

FsSelection::FsSelection(QWidget *parent)
    : QWizardPage(parent)
{
    setTitle(QObject::tr("Flugsimulator Wählen"));
    setSubTitle(QObject::tr("Wählen Sie Ihren Flugsimulator aus"));

    QLabel *label = new QLabel(QObject::tr("Bitte wählen Sie aus, für welchen Flugsimulator Sie die Liverys installieren möchten."));
    label->setWordWrap(true);

    // --- Formular erzeugen ---
    QRadioButton *fs9 = new QRadioButton(this);
    fs9->setText("Microsoft Flight Simulator 2004 / FS9");
    QRadioButton *fsx = new QRadioButton(this);
    fsx->setText("Microsoft Flight Simulator X / FSX");


    connect(fs9, SIGNAL(clicked()), this, SLOT(enableNextButton()));
    connect(fsx, SIGNAL(clicked()), this, SLOT(enableNextButton()));

    // --- Layout einstellen ---
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(fs9);
    layout->addWidget(fsx);

    setLayout(layout);
}

//                          //
//  ### Livery Download ### //
//                          //

GetLiveryInformation::GetLiveryInformation(QWidget *parent)
    : QWizardPage(parent)
{
    setTitle(QObject::tr("Download..."));
    setSubTitle(QObject::tr("Bitte warten!"));

    QLabel *label = new QLabel(QObject::tr("Es wird eine Liste mit verfügbaren Liverys heruntergeladen... bitte warten Sie einen Moment!"));
    label->setWordWrap(true);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);

    setLayout(layout);
}

//                          //
//  ### Livery Auswahl ###  //
//                          //

LiverySelection::LiverySelection(QWidget *parent)
    : QWizardPage(parent)
{
    setTitle(QObject::tr("Livery wählen"));
    setSubTitle(QObject::tr("Livery zum herunterladen auswählen."));

    QLabel *label = new QLabel(QObject::tr("Bitte wählen Sie aus der Liste der verfügbaren Liverys die von Ihnen gewünschte Livery aus, um sie herunterzuladen und zu installieren.<br /><br />"));
    label->setWordWrap(true);

    QListWidget *liverys = new QListWidget;
    liverysList << "PMDG747-400" << "PMDG747-400F" << "IFly 737-800";
    liverys->addItems(liverysList);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(liverys);
    setLayout(layout);
}


Ich hoffe, dass das weiterhilft.. :cry:
Zuletzt geändert von crossfader am 9. Oktober 2011 21:31, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Fehler nach Auslagerung der QWizardPages

Beitrag von Christian81 »

Sorry aber minimal ist was anderes... :(
Und der Sinn eines minimalen Beispiel ist es nicht uns dahinter zu verstecken sondern dass man durch das Reduzieren auf das wesentliche von allein auf den Fehler kommt.

Das Problem kommt nicht vom Auslagern sondern dass ein enum - Werte genauso wie die Klasse heißt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
crossfader
Beiträge: 31
Registriert: 18. September 2010 21:21
Wohnort: Lengerich
Kontaktdaten:

Re: Fehler nach Auslagerung der QWizardPages

Beitrag von crossfader »

Hi Christian!

Entschuldige bitte.. :(

Vielen Dank für die Antwort! manchmal sind die Fehler einfach zu doof um gefunden zu werden!

Gruß,
Olli
Antworten