hi...habe es jetzt endlich geschaft ein widget zu erstellen das auch buttons und bildchen anzeigt.
nun meine frage. schreibe ein größeres projekt. unter windows hatte es 5 Formen.
würde es gern wieder so gestallten zwecks der übersichtlichkeit. wie muss ich den aufruf eines neuen widges bzw einer neuen form gestalten wenn ich, z.bps: in der ersten form auf ein button drücke?
momentan rufe ich meine erste form so auf:
#include <Form1.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv );
QWidget *window = new QWidget;
Ui::Form ui;
ui.setupUi(window);
window->show();
return app.exec();
}
danke
Qt Designer: zwischen widges / formen wechseln
hallöchen...habe das mit dem designer mal gelassen. programmiere jetzt frei. versuche es zumindest 
habe jetzt ein widget mit allen buttons und was ich sonst noch so brauche erstellt:
#include "MainWindow.h"
#include <QtGui>
MainWindow::MainWindow( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Form"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
.....}
jetzt möchte ich in meiner main.cpp eine switch case anweisung machen.
#include "MainWindow.h"
#include <QApplication>
#define M_Start 0
#define M_Auswahl 1
unsigned char aktuellesMenu=M_Start;
int main(int argc, char *argv[])
{
QApplication app( argc, argv );
MainWindow Form1;
Form1.show();
switch(aktuellesMenu)
{
case M_Start:........break;
case M_Auswahl:.....break;
default: break;
return app.exec();
}}
so...jetzt möchte ich wenn ich z.bsp. mich in M_Start befinde das nur der Button_Start auf show() ist und der rest auf hide gesetzt wird.
und wenn ich dann Button_Start drücke möchte ich in M_Auswahl rutschen und andere buttons und labels angezeigt werden.
wie mache ich das? und ist es so sinnvoll? wo packe ich mein
-> connect(Button_Start_Back, SIGNAL(clicked()), Button_Start_Back, SLOT(hide())); hin ?
danke
habe jetzt ein widget mit allen buttons und was ich sonst noch so brauche erstellt:
#include "MainWindow.h"
#include <QtGui>
MainWindow::MainWindow( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Form"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
.....}
jetzt möchte ich in meiner main.cpp eine switch case anweisung machen.
#include "MainWindow.h"
#include <QApplication>
#define M_Start 0
#define M_Auswahl 1
unsigned char aktuellesMenu=M_Start;
int main(int argc, char *argv[])
{
QApplication app( argc, argv );
MainWindow Form1;
Form1.show();
switch(aktuellesMenu)
{
case M_Start:........break;
case M_Auswahl:.....break;
default: break;
return app.exec();
}}
so...jetzt möchte ich wenn ich z.bsp. mich in M_Start befinde das nur der Button_Start auf show() ist und der rest auf hide gesetzt wird.
und wenn ich dann Button_Start drücke möchte ich in M_Auswahl rutschen und andere buttons und labels angezeigt werden.
wie mache ich das? und ist es so sinnvoll? wo packe ich mein
-> connect(Button_Start_Back, SIGNAL(clicked()), Button_Start_Back, SLOT(hide())); hin ?
danke
Hi Maik,
die Funktionalität würde ich nicht im Main implementieren, sondern in deiner MainWindow Klasse. Und da bietet dir Qt einige Möglichkeiten. z.B. hast du da die Wahl zwischen verschiedenen Container-Klassen wie Stacked Widget oder Tab Widget.
Mit der Klasse Stacked Widget kannst du verschieden Views 'aufeinander legen', wobei immer nur die gewünscht View sichtbar ist. Die einzelnen Views kannst du nach belieben Gestalten bzw. mit weiteren Objekten füllen.
Am besten würde ich dies mit dem Designer umsetzen. Ich nehme an, da du auf den Designer verzichtest, hast du nach wie vor Probleme damit? Ich bin zwar auch noch ein Anfänger, aber auf den Designer möchte ich nicht mehr verzeichten.
Hier noch ein kleines Bsp. auf um auf deine erste Frage zurück zu kommen.
Erstelle ein MainWindow mit dem Designer und bennene dieses Objekt auch so. Dann speicherst du das MainWindow unter mainwindow.ui. Anschliessend erstelle die zur MainWindow gehörende Klasse.
Hier die Header Datei:
Die Datei ui_mainwindow.h wird von qmake erstellt, muss aber von dir selber eingebunden werden.
Die CPP Datei sieht dann folgendermassen aus:
Die main Datei könnte dann in etwa so aussehen.
Die .pro Datei könnte dann z.B. so aussehen:
Möchtest du nun ein Dialog oder ein Widget vom MainWindow aus starten können, gehst du genau gleich vor. Erstelle dein Dialog mit dem Designer und erstelle die Klasse zum Dialog. Binde die Header Datei der Dialog Klasse in deiner MainWindow Klasse und erstelle da dein Dialog Objekt. Füge ein Pushbutton in dein MainWindow und verbinde das clicked() Signal mit einer Slotfunktion, in der du dann dein Dialog Objekt aufrufst. Vergessen nicht die erstellten Dateien der neuen Dialog Klasse in der .pro Datei einzutragen.
Hoffe das hilft ein wenig, ansonsten einfach nachfragen...bin aber selber noch Anfänger
In diesem Sinne... HOPP SCHWIIZ!!
die Funktionalität würde ich nicht im Main implementieren, sondern in deiner MainWindow Klasse. Und da bietet dir Qt einige Möglichkeiten. z.B. hast du da die Wahl zwischen verschiedenen Container-Klassen wie Stacked Widget oder Tab Widget.
Mit der Klasse Stacked Widget kannst du verschieden Views 'aufeinander legen', wobei immer nur die gewünscht View sichtbar ist. Die einzelnen Views kannst du nach belieben Gestalten bzw. mit weiteren Objekten füllen.
Am besten würde ich dies mit dem Designer umsetzen. Ich nehme an, da du auf den Designer verzichtest, hast du nach wie vor Probleme damit? Ich bin zwar auch noch ein Anfänger, aber auf den Designer möchte ich nicht mehr verzeichten.
Hier noch ein kleines Bsp. auf um auf deine erste Frage zurück zu kommen.
Erstelle ein MainWindow mit dem Designer und bennene dieses Objekt auch so. Dann speicherst du das MainWindow unter mainwindow.ui. Anschliessend erstelle die zur MainWindow gehörende Klasse.
Hier die Header Datei:
Code: Alles auswählen
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow,
private Ui::MainWindow
{
Q_OBJECT
public:
// Konstruktor
MainWindow( QMainWindow *parent = 0 );
};
Die CPP Datei sieht dann folgendermassen aus:
Code: Alles auswählen
#include "mainwindow.h"
MainWindow::MainWindow( QMainWindow *parent )
: QMainWindow( parent )
{
setupUi( this );
}
Code: Alles auswählen
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow *mainWindow = new MainWindow();
mainWindow->show();
return app.exec();
}
Code: Alles auswählen
TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += mainwindow.h
FORMS += mainwindow.ui
SOURCES += main.cpp \
mainwindow.cpp
Hoffe das hilft ein wenig, ansonsten einfach nachfragen...bin aber selber noch Anfänger
In diesem Sinne... HOPP SCHWIIZ!!
danke erstmal für die hilfe. aber wie gesagt, möchte gern auf den designer verzichten.
habe das problem wie folgt gelöst.
habe ein container widget in dem ich verschiede widgets je nach dem auf show setze. wegen objektorientierung habe ich noch ein zweites container widget erstellt.
in ihm werden wiederum widgets auf aktiv/show gesetzt.
was leider noch nicht geht ist, wenn ich mich im 2. container widget(Main_Bit) befinde ( Widget_BitMenue ist aktiv) und ich den BACK botton von BitMenue clicke sprint es leider nicht in mein erstes container widget.
aber das wird schon
hier der code, vielleicht hilft es mal jemanden
#ifndef WIDGET_MAIN_H
#define WIDGET_MAIN_H
#include <QtCore/QVariant>
.....
class Widget_Navi;
class Widget_Main_Bit;
class Widget_Karte;
class Widget_Start;
class Widget_Auswahl;
class Widget_Main : public QWidget
{
Q_OBJECT
public:
Widget_Main( QWidget *parent = 0);
private:
Widget_Navi* nav;
Widget_Main_Bit* bitmain;
Widget_Karte* map;
Widget_Auswahl* auswahl;
Widget_Start* entry;
QWidget* activeWidget;
QWidget* widgets[5];
public slots:
void ChangeMode(int mode);
};
#endif
//Widget_Main.cpp
#include "Widget_Main.h"
#include "Widget_Start.h"
#include "Widget_Auswahl.h"
...
Widget_Main::Widget_Main( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Widget_Main"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
setMaximumSize(QSize(1024, 777));
setBaseSize(QSize(1024, 777));
entry=new Widget_Start(this);
entry->setVisible(true);
widgets[0]=entry;
auswahl=new Widget_Auswahl(this);
auswahl->setVisible(false);
widgets[1]=auswahl;
....
activeWidget=entry;
}
void Widget_Main::ChangeMode(int mode)
{
if(mode > 4 || mode < 0 ) return;
activeWidget->setVisible(false);
activeWidget=widgets[mode];
activeWidget->setVisible(true);
}
//Widget_Start.cpp
#include "Widget_Start.h"
#include "Widget_Main.h"
#include <QtGui>
Widget_Start::Widget_Start( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Widget_Start"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
setMaximumSize(QSize(1024, 777));
setBaseSize(QSize(1024, 777));
QPalette palette;
.......
Button_Start = new QPushButton(this);
Button_Start->setObjectName(QString::fromUtf8("Button_Back"));
Button_Start->setGeometry(QRect(900, 720, 87, 27));
Button_Start->setText("Start");
//Button_Start clicked
connect(Button_Start,SIGNAL(clicked()),this,SLOT(changeAuswahl()));
connect(this,SIGNAL(ChangeMode( int )),(Widget_Main*)parent,SLOT(ChangeMode(int)));
}
void Widget_Start::changeAuswahl()
{
emit ChangeMode(1);
}
//Widget_Start.h
class Widget_Start : public QWidget
{
Q_OBJECT
public:
Widget_Start( QWidget *parent = 0);
QLabel *Label_links;
QLabel *Label_rechts;
QPushButton *Button_Start;
.....
private slots:
void changeAuswahl();
signals:
void ChangeMode(int mode);
};
habe das problem wie folgt gelöst.
habe ein container widget in dem ich verschiede widgets je nach dem auf show setze. wegen objektorientierung habe ich noch ein zweites container widget erstellt.
in ihm werden wiederum widgets auf aktiv/show gesetzt.
was leider noch nicht geht ist, wenn ich mich im 2. container widget(Main_Bit) befinde ( Widget_BitMenue ist aktiv) und ich den BACK botton von BitMenue clicke sprint es leider nicht in mein erstes container widget.
aber das wird schon
hier der code, vielleicht hilft es mal jemanden
#ifndef WIDGET_MAIN_H
#define WIDGET_MAIN_H
#include <QtCore/QVariant>
.....
class Widget_Navi;
class Widget_Main_Bit;
class Widget_Karte;
class Widget_Start;
class Widget_Auswahl;
class Widget_Main : public QWidget
{
Q_OBJECT
public:
Widget_Main( QWidget *parent = 0);
private:
Widget_Navi* nav;
Widget_Main_Bit* bitmain;
Widget_Karte* map;
Widget_Auswahl* auswahl;
Widget_Start* entry;
QWidget* activeWidget;
QWidget* widgets[5];
public slots:
void ChangeMode(int mode);
};
#endif
//Widget_Main.cpp
#include "Widget_Main.h"
#include "Widget_Start.h"
#include "Widget_Auswahl.h"
...
Widget_Main::Widget_Main( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Widget_Main"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
setMaximumSize(QSize(1024, 777));
setBaseSize(QSize(1024, 777));
entry=new Widget_Start(this);
entry->setVisible(true);
widgets[0]=entry;
auswahl=new Widget_Auswahl(this);
auswahl->setVisible(false);
widgets[1]=auswahl;
....
activeWidget=entry;
}
void Widget_Main::ChangeMode(int mode)
{
if(mode > 4 || mode < 0 ) return;
activeWidget->setVisible(false);
activeWidget=widgets[mode];
activeWidget->setVisible(true);
}
//Widget_Start.cpp
#include "Widget_Start.h"
#include "Widget_Main.h"
#include <QtGui>
Widget_Start::Widget_Start( QWidget *parent)
: QWidget (parent)
{
setObjectName(QString::fromUtf8("Widget_Start"));
resize(1024, 777);
setMinimumSize(QSize(1024, 777));
setMaximumSize(QSize(1024, 777));
setBaseSize(QSize(1024, 777));
QPalette palette;
.......
Button_Start = new QPushButton(this);
Button_Start->setObjectName(QString::fromUtf8("Button_Back"));
Button_Start->setGeometry(QRect(900, 720, 87, 27));
Button_Start->setText("Start");
//Button_Start clicked
connect(Button_Start,SIGNAL(clicked()),this,SLOT(changeAuswahl()));
connect(this,SIGNAL(ChangeMode( int )),(Widget_Main*)parent,SLOT(ChangeMode(int)));
}
void Widget_Start::changeAuswahl()
{
emit ChangeMode(1);
}
//Widget_Start.h
class Widget_Start : public QWidget
{
Q_OBJECT
public:
Widget_Start( QWidget *parent = 0);
QLabel *Label_links;
QLabel *Label_rechts;
QPushButton *Button_Start;
.....
private slots:
void changeAuswahl();
signals:
void ChangeMode(int mode);
};