Anzeige in der Taskleiste

Verschiedenes zu Qt
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

The QApplication object is accessible through the instance() function which return a pointer equivalent to the global qApp pointer.

Code: Alles auswählen

connect(buttonAuswahlBeenden, SIGNAL(clicked()), QApplication::instance(), SLOT(quit())); // Beendent Applikation

connect(buttonAuswahlBeenden, SIGNAL(clicked()), qApp, SLOT(quit())); // Beendent Applikation


Beides geht, vorausgesetzt, <QApplication> ist inkludiert. Alles alter Kram, aber jeder muss mal anfangen. Die Qt-Doku ist mächtig aber auch riesig :wink:
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

Ja, ich bin es hier nochmal in diesem Thread. Beziehe mich auf die Aussage von Hunter:
jetzt z.B. den SLOT in deiner Auswahl klasse machst musst du auch einen Pointer zum mainWindow und myA an die Klasse übergeben und dann im slot aufrufen:
mainWindow->setCentralWidget(myA);
Das habe ich versucht zu realisieren, also einen Zeiger aus Auswahl auf das MainWindow. Hier der Quellcode. Ich habe die entsprechenden Zeilen kommentiert:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

#include <auswahl.h>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();


    Auswahl *myAuswahl;

};

#endif // MAINWINDOW_H

Code: Alles auswählen

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    myAuswahl = new Auswahl(this);   // Übergabe des MainWindow Objekts im Konstruktor von Auswahl
    setCentralWidget(myAuswahl);
}

MainWindow::~MainWindow()
{

}

Code: Alles auswählen

#include <QtGui/QApplication>
#include <mainwindow.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Code: Alles auswählen

#ifndef AUSWAHL_H
#define AUSWAHL_H



#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>

#include <a.h>
//#include <mainwindow.h>
#include <QApplication>

class Auswahl : public QWidget
{
    Q_OBJECT

public:
    Auswahl(MainWindow * myWin);        // Konstruktor mit Objekt MainWindow
    QPushButton *buttonAuswahlKlasseA;
    QPushButton *buttonAuswahlBeenden;
    QVBoxLayout * layoutAuswahl;
    QLabel * labelInfoAuswahl;

    MainWindow *windowObj;              // Zeiger auf ein MainWindow Objekt
     A *myA;

 public slots:
     void createA(void);
};

#endif // AUSWAHL_H

#include <auswahl.h>
#include <mainwindow.h> //


Code: Alles auswählen

Auswahl::Auswahl(MainWindow *myWin)
{
    windowObj = myWin;          // Zuweisung des übergebenen Obejkts MainWindow

    buttonAuswahlKlasseA = new QPushButton(tr("Auswahl Klasse A"));
    connect(buttonAuswahlKlasseA, SIGNAL(clicked()), this, SLOT(createA()));

    buttonAuswahlBeenden = new QPushButton(tr("Beenden"));
    connect(buttonAuswahlBeenden, SIGNAL(clicked()), qApp, SLOT(quit())); // Beendent Applikation


    labelInfoAuswahl = new QLabel(tr("Auswahl Klasse"));

    layoutAuswahl = new QVBoxLayout;
    layoutAuswahl->addWidget(labelInfoAuswahl);
    layoutAuswahl->addWidget(buttonAuswahlKlasseA);
    layoutAuswahl->addWidget(buttonAuswahlBeenden);
    setLayout(layoutAuswahl);
}


void Auswahl::createA(void)
{
    myA = new A();
    //windowObj->setCentralWidget(myA);               // hier wird über den Zeiger auf die Funktion von MainWindow zugegriffen
}
Hmm, das funktioniert leider nicht. Der Qt Creator bricht mit folgenden Hinweisen ab, aus denen ich leider nicht schlau werde, sonst hätte ich mir diesen Post ja gespart:




Was habe ich falsch gemacht? Ist bestimmt was "dummes"! Danke für hilfreiche Antworten

LG TK
Dateianhänge
Unbenannt.JPG
Unbenannt.JPG (33.96 KiB) 3129 mal betrachtet
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bitte kopier die Meldung doch einfach ab, geht schneller zu laden, und ist für dich mindestens auch schneller zu posten...

Zum Problem:
in auswahl.h statt dem (auskommentierten) #include "mainwindow.h" ein "class MainWindow;"
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

Hey Franz,

danke, so geht's. Aber wieso gings nichts, wie ich es dachte?

1.
Warum muss ich da eine Vorwärtsdeklaration "class MainWindow" setzten?

2.
Warum geht es nicht mit meiner auskommentierten Zeile include <mainwindow.h>?

3.
Kommentiere ich "include <mainwindo.h>" aus, schreibe "class MainWindow" UND kommentiere in der auswahl.cpp die Zeile "#include <mainwindow.h>" aus, kommen folgende Fehlermeldungen:

C:/Qt/TEST/Test/auswahl.cpp:31: error: invalid use of undefined type `struct MainWindow'

C:/Qt/TEST/Test/./auswahl.h:15: error: forward declaration of `struct MainWindow'

Warum, muss denn nun auch in der Auswahl.cpp das "include <mainwindow.h>" nun stehen? Das verstehe ich leider nicht so ganz. Danke für das Lehren :)

LG TK
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Steht das denn nicht in deinem C++-Buch drinnen?
Kurz: Immer wenn du eine Klasse verwenden willst, muss bekannt sein WIE man diese Klasse verwenden kann, also die API, und das geht über den #include. Wenn du nur nen Pointer deklarierst, oder die Klasse als Rückgabewert bzw Parameter einer Funktion brauchst, reicht eine Vorwärtsdeklaration (für die Implementierung der Funktion muss natürlich - entsprechende Verwendung vorausgesetzt - ein #include her).
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

Moin Franz,

dein Post hat eine respektable Uhrzeit =) Ich habe nur einen dicken Wälzer - und da steht C drauf. Hm, war immer der Meinung ein include reicht da vollkommen aus, um sich Zeiger auf Objekte zu erzeugen. Ist dann nur bei C so.
(für die Implementierung der Funktion muss natürlich - entsprechende Verwendung vorausgesetzt - ein #include her).
Hiermit meinst du wohl das include in Auswahl.cpp

Da taucht aber noch eine Frage auf. Warum kann ich dann in einer xxx.h Datei, wenn ich z.B. einen Zeiger auf ein Label erzeugen möchte,

#include <QLabel>
oder
class QLabel;

schreiben?

LG TK
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

ein include reicht nicht nur in C, sondern auhc in C++.
Problem ist nur die wechselseitige Abhängigkeit. MainWindow hat einen Pointer auf Auswahl, Auswahl einen Pointer auf MainWindow.

Versuch einfach mal, in mainwindow.h und auswahl.h ein #include des jeweils anderen Header. Dann siehst du das Problem.
Nebenbei reicht es auch, wenn du in mainwindow.h statt auswahl zu includieren die Klasse Auswahl vorwärts deklarierst.

Die Forward-Deaklaration bringt im übrigen auch Geschwindigkeitsvorteil beim Kompilieren. Ein #include sorgt immer dafür, dass der Header geparst wird. Wenn du nun auswahl.h mehrfach includierst, und darin befindet sich ein #include "mainwindow.h" wird auch jedesmal mainwindow.h geparst.

Also wenn es geht im Header IMMER Vorwärtsdeklaration verwenden.
Hoffe das war einigermaßen klar.

Grüße
Franz
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

Danke für die Erklärung!
Ich experimentiere noch ein wenig damit, um das Verständnis zu festigen.

LG TK
Antworten