Maemo / QMainWindow und der Retourwert

Wer für Maemo entwickelt (und das noch bequemer weise im QT-Creator machen will) kommt zu folgendem Problem:

  • Vollbildfenster („StackedWindow) kommen an N900 nur mit einem QMainWindow
  • Menüs (QMenuBar) kann man im QT-Creator nur an ein  QMainWindow zuweisen 🙁
  • QMainWindow kann allerdings keinen Retourwert geben auf den man reagieren kann. Ev. hat das StackedWindow etwas getan dass sich auf das aufrufende Fenster auswirkt ?

Wer denkt dass er diese 3 kleinen Punkte locker lösen kann, ist hiermit aufgerufen sich mitzuteilen…

QDialog geht zwar betreffend des Retourwertes, allerdings kann der QT-Creator leider kein Menü an ein QDialog binden….

Ich habe es wie folgt gelöst:

 

Anstatt ich einen Retourwert vom StackedWindow erwarte, rufe ich einfach aus dem StackedWindow heraus eine (beliebige) Funktion aus der aufrufenden Klasse auf.

So geht´s :

Das aufrufende Programm (categoriemain.cpp)

void CategorieMain::Cat_Clicked(int i) {
    Cat_app *win2 =new Cat_app(this);

    // Wird für Maemo übersetzt ? dann die Eigenschaft "StackedWindow" setzen
    #ifdef Q_WS_MAEMO_5
        win2->setAttribute(Qt::WA_Maemo5StackedWindow);
    #endif

    win2->setCat(cat);
    // Zeichnen der Buttons - als Parameter wird der Index des angeklickten Buttons übergeben....
    win2->createButtons(i);
    // Nachdem das Unterfenster ein "QMainWindow" ist (wegen des Menüs) gibt es keinen Retourwert im eigentlichen Sinne.
    // Damit das Unterfenster trotzdem dieses Fenster neu zeichnen kann wird das Objekt "this" an das Childfenster übergeben.
    // Im Childfenster kann damit die Funktion "NeuZeichnen()" aufgerufen werden
    win2->setParent(this);
 
   // Guckuck - Fenster da ?
    win2->show();

}

Die Headerdatei von cat_app.h

class Cat_app : public QMainWindow {
    Q_OBJECT
public:
    Cat_app(QWidget *parent = 0);
    ~Cat_app();
    void setCat(QList &cat);
    QList getCat();
    void getAnzCat();
    void createButtons(int);
    bool getVeraendert();
    void setParent(CategorieMain *oParameter);
protected:
    void changeEvent(QEvent *e);
    // Überschreiben des "closeEvent" - damit können wir beim schliessen des Fenster etwas machen bevor das Fenster dicht macht
    void closeEvent(QCloseEvent *event);
private:
    Ui::Cat_app *ui;
    int nAktuellCat;
    bool bVeraendert;
    // Variable für das Elternfenster als Zeiger speichern
    CategorieMain *oParent;

Der Sourcecode vom StackedWindow (cat_app.cpp)

Cat_app::Cat_app(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Cat_app)
{
    ui->setupUi(this);
    bVeraendert = false;
    oParent = NULL;
}
void Cat_app::closeEvent(QCloseEvent *event)
{
    if (oParent != NULL) {
// Hier passierts !!!! Ich rufe eine Funktion des Parent auf - wirkt sich beim Schliessen dieses Fensters aus (früher braucht es Maemo nicht)
        oParent->NeuZeichnen();
    }

    event->accept();
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert