per Slot ein neues Fenster erstellen

Alles rund um die Programmierung mit Qt
Antworten
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

per Slot ein neues Fenster erstellen

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

Beitrag von Christian81 »

Code: Alles auswählen

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

Beitrag von JimiJones »

sry das ist ein Fehler....einfach ein "go" bei dem "autsch" denken;)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann geht es auch - zeig uns ein komplettes Beispiel welches wir auch kompilieren können als Attachment.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

Beitrag von JimiJones »

hier ist es:
Dateianhänge
SpaceInvaders.zip
(140.45 KiB) 56-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

Beitrag von JimiJones »

cool danke....
aber wie übergebe ich der menu.cpp dem s aus der main.cpp?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

Beitrag von JimiJones »

Ich nehme einfach mal an durch Vererbung....

Diese Veränderung bringt aaber leider nichts:

class menu : public QWidget, public spiel
{
....
....
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
JimiJones
Beiträge: 6
Registriert: 11. Mai 2010 11:26

Beitrag von JimiJones »

Habs jetzt mal so geändert wie ich denke das es passt...
Leider bekomme ich noch eine Fehlermeldung
Hier mal das Projekt
Dateianhänge
SpaceInvaders.zip
(119.66 KiB) 42-mal heruntergeladen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :/
Antworten