Seite 1 von 1

per Slot ein neues Fenster erstellen

Verfasst: 11. Mai 2010 16:40
von JimiJones
Hallo zusammen,

ich bin ein absoluter Qt-Neuling, also nimmt bitte etwas rücksicht :)

Es geht darum,dass ich mir ein kleines Menü gebaut habe...Der Exit-Befehl klappt wunderbar, der andere Button soll das neue Widget starten.

Also hab ich mir ein eigenen Slot gemacht mit Namen "go".
Der funzt auch nur ich weiß nicht wie in der menu.cpp bei
void menu::go(){
}
das Widget aufrufen kann. habs mal so probiert wie hier im mitgelieferten code, aber das ist sicher Blödsinn.
Hier mal der Code:



Code: Alles auswählen

menu.h

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

class menu : public QWidget
{
    Q_OBJECT
public:
    menu(void);
public slots:
  void go(void);
private:
    QPushButton *exit;
    QPushButton *start;
};
[/code]
main.cpp

#include <QLabel>
#include <QDialog>
#include <QKeyEvent>
#include <QApplication>
#include <QPushButton>
#include <qlayout.h>
//#include <QtGui>

#include "spiel.h"
#include "spiel.cpp"
#include "menu.h"
#include "menu.cpp"


int main(int argc, char * argv[]){
QApplication app (argc, argv);


spiel *s = new spiel();
menu *m = new menu();


int a=600;
int b=400;

s->setFixedSize(a,b);
m->setFixedSize(a,b);

s->setStyleSheet("background: url('background.jpg')");
//m->setStyleSheet("background: url('background.jpg')");

//s->show();
m->show();


return app.exec();
} menu.cpp

menu::menu(void)
{
//Knöpfe erzeugen
start = new QPushButton("Spiel starten",this);
QObject::connect(start, SIGNAL(clicked()), this, SLOT(autsch()));
//hello->setGeometry(20,20,100,30);
start->setMinimumSize(start->sizeHint());

exit = new QPushButton("Beenden",this);
QObject::connect(exit, SIGNAL(clicked()), qApp, SLOT(quit()));
//hello->setGeometry(20,20,100,30);
exit->setMinimumSize(exit->sizeHint());

// QVBoxLayout für vertikales Layout
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(start); // Knoepfe hinzufuegen
layout->addWidget(exit);
layout->activate(); // Layoutmanager aktivieren
}

void menu::go() {
//start->setText("Aua, nicht so grob !");
spiel();
}

Code: Alles auswählen


Hoffe es ist klaar geworden, was ich meine.
Danke für die Antworten die hoffentlich folgen :D 

Verfasst: 11. Mai 2010 17:02
von Christian81

Code: Alles auswählen

QObject::connect(start, SIGNAL(clicked()), this, SLOT(autsch())); 
Ich dachte Dein Slot heisst go() ...

Verfasst: 11. Mai 2010 19:37
von JimiJones
sry das ist ein Fehler....einfach ein "go" bei dem "autsch" denken;)

Verfasst: 12. Mai 2010 06:30
von Christian81
Dann geht es auch - zeig uns ein komplettes Beispiel welches wir auch kompilieren können als Attachment.

Verfasst: 12. Mai 2010 10:18
von JimiJones
hier ist es:

Verfasst: 12. Mai 2010 10:32
von Christian81
Der Slot wird korrekt aufgerufen. Aber innerhalb des Slots machst Du nichts weiter als eine Instanz von spiel zu erzeugen und dann, da die Funktion ja wieder verlassen wird, diese Instanz wieder zerstörst.

Was Du eher machen wollest war wohl s->show() wobei s von main.cpp in deine Menuklasse mit übergeben werden sollte denke ich mal.

Verfasst: 12. Mai 2010 10:38
von JimiJones
cool danke....
aber wie übergebe ich der menu.cpp dem s aus der main.cpp?

Verfasst: 12. Mai 2010 12:27
von Christian81
JimiJones hat geschrieben:cool danke....
aber wie übergebe ich der menu.cpp dem s aus der main.cpp?
Ich würde sagen - schnapp Dir ein C++ Buch und schau Dir an wie man einer Funktion/Klasse einen Parameter übergibt.

Verfasst: 12. Mai 2010 16:19
von JimiJones
Ich nehme einfach mal an durch Vererbung....

Diese Veränderung bringt aaber leider nichts:

class menu : public QWidget, public spiel
{
....
....
}

Verfasst: 12. Mai 2010 17:52
von franzf
JimiJones hat geschrieben:Ich nehme einfach mal an durch Vererbung....
Es ist genau das andere... Aggregation.
Wie kannst du ein Objekt (oder einen Zeiger darauf) in einer Klasse speichern?
Wie bekommst du das dann da hin?
Wo bekommst du das da hin?

Versuch erstmal selber drauf zu kommen. Schnapp dir ein Buch über C++ und les dir die Kapitel über Objektorientierung/Objektinteraktion durch.

Verfasst: 13. Mai 2010 13:26
von JimiJones
Habs jetzt mal so geändert wie ich denke das es passt...
Leider bekomme ich noch eine Fehlermeldung
Hier mal das Projekt

Verfasst: 13. Mai 2010 13:45
von franzf
Ich hab mal versucht das zu kompilieren...
Da kommen ja noch dermaßen viele Compile-Errors, da kannst du noch absolut nichts zu deinem Problem sagen!
Weißt du denn was mit Aggregation gemaint ist? Google mal nach "OOP Aggregation" für genauere Beschreibung.

Kurz: Du möchtest dein Objekt aus einem/mehreren anderen Objekten zusammensetzen.
Deine Klassenaufteilung gefällt mir auch noch nicht so ganz. menu soll eigentlich nix von den anderen Klassen wissen. Ich denke ein spiel (im sinne von "Spielbrett") sollte ein menu "haben". Das menu kann dann via SIGNAL mitteilen, was gerade geklickt wurde und z.B. ein "emit exitRequested()" abfeuern, worauf dann das SPIEL reagiert.
spiel wird damit unabhängig.

Desweiteren solltest du vllt. deine Widgets ordentlich in Layouts packen.

Und zu guter letzt: Ich denke dass dir noch einige C++-Grundlagen fehlen, sonst hättest du hier jetzt nicht solche Probleme :/