Seite 1 von 1

MainWindow und Widgets

Verfasst: 9. Dezember 2009 14:43
von danmor
Hallo zusammen

Ich stehe hier fest und komme nicht mehr weiter. Irgendwie habe ich das Grundprinzip auch, glaube ich, falsch verstanden. Mein Ziel ist es, eine Anzeige zu machen mit mehreren Buttons und mit Klick auf diese gelangt man in ein anderes Fenster.

Das Widget in der Klasse mainPage wird korrekt erstellt, sprich mit meinem gewünschten Inhalt. Ebenso wird das mainWindow korrekt erstellt, beides kann ich mit show() anzeigen. Was muss ich nun tun, damit mein Widget im mainWindow angezeigt wird?

Danke für euere Hilfe!

Folgendes habe ich bis jetzt erstellt (relevante Dateien & teilweise gekürzt):

main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QtCore>
#include "gui.h"

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

    Gui gui;

    return a.exec();
}
gui.cpp

Code: Alles auswählen

#include "gui.h"
#include "pages.h"

Gui::Gui(){
    QMainWindow *mainWindow = new QMainWindow;
    this->mainLayout = new QVBoxLayout;
    mainWindow->setFixedSize(800,600);

    mainLayout->addWidget(new mainPage);
    mainWindow->setLayout(mainLayout);
    mainWindow->show();
}
pages.cpp

Code: Alles auswählen

#include "pages.h"

mainPage::mainPage(QWidget *parent):QWidget(parent){
    qWarning("start in mainPage::");
    this->startWidget = new QWidget;
    this->startLayout = new QVBoxLayout;
    this->startLayout->setAlignment(Qt::AlignHCenter);

    QLabel* lblTitle = new QLabel("Titel");
   
    QPushButton* btnGame = new QPushButton("");
    btnGame->setFixedSize(380,80);
    connect(btnGame, SIGNAL(clicked()), this, SLOT(onGame()));

    QPushButton* btnHighscore = new QPushButton("");
    btnHighscore->setCursor(QCursor(Qt::PointingHandCursor));
    connect(btnHighscore, SIGNAL(clicked()), this, SLOT(onHighscore()));

    QSpacerItem* verticalSpacer = new QSpacerItem(10, 10, QSizePolicy::Fixed, QSizePolicy::Fixed);
    this->startLayout->addWidget(lblTitle);
    this->startLayout->addItem(verticalSpacer);
    this->startLayout->addWidget(btnGame);
    this->startLayout->addWidget(btnHighscore);
    this->startLayout->addItem(verticalSpacer);
    this->startWidget->setLayout(startLayout);
}
gui.h

Code: Alles auswählen

#ifndef GUI_H
#define GUI_H
#include <QtGui>

class Gui:public QMainWindow{
    Q_OBJECT
public:
    Gui();
    ~Gui();
private:
    QWidget* mainWindow;
    QVBoxLayout* mainLayout;
};

#endif // GUI_H
pages.h

Code: Alles auswählen

#ifndef PAGES_H
#define PAGES_H
#include <QtGui>
#include <QWidget>

class mainPage:public QWidget{
    Q_OBJECT
public:
    mainPage(QWidget *parent = 0);
    ~mainPage();
private:
    QVBoxLayout* mainLayout;
    QVBoxLayout* startLayout;
    QWidget* startWidget;
public slots:
    void onGame();
    void onHighscore();
    void onRules();
    void onAbout();
    void onQuit();
};

#endif // PAGES_H

Verfasst: 9. Dezember 2009 14:58
von archer
Warum erzeugt du eine MainWindow in einem Mainwindow?
Egal...

Mir scheint es fehlt in Gui()
setLayout(this->mainLayout);
oder es wird
mainLayout = new QVBoxLayout(this);

Schau dir auch noch mal setCentralWidget an.

Verfasst: 9. Dezember 2009 15:31
von danmor
Vielen Dank für deine Antwort!
Ich habe nun meine Gui Klasse folgendermassen angepasst:

gui.cpp

Code: Alles auswählen

Gui::Gui(){
    this->mainWindow = new QMainWindow;
    this->mainLayout = new QVBoxLayout;
    this->mainWidget = new QWidget;

    this->mainWindow->setWindowTitle("Titel");
    this->mainWindow->setFixedSize(800,600);
    this->mainWindow->setCentralWidget(this->mainWidget);

    this->mainWidget = new mainPage;

    this->mainLayout->addWidget(this->mainWidget);
    this->setLayout(this->mainLayout);
    this->mainWindow->show();
}
leider hat dies nichts gebracht, es wird mir weiterhin ein leeres mainWindow angezeigt. Wenn ich in der Klasse mainPage startWidget.show() aufrufe zeigt es das Widget korrekt an. Wenn ich aber in der Klasse Gui this->startWidget anzeige ist es leer. Kann es ein Vererbungsproblem sein? Mittlerweile sehe ich glaub den Wald vor lauter Bäumen nicht mehr...

Verfasst: 9. Dezember 2009 15:48
von archer
Ich versteh immer noch nicht warum eine QMainWindow in ein QMainwindow soll?
Deine Gui Klasse erbt doch von QMainWindow.
Warum nicht soetwas in der Art

Code: Alles auswählen

Gui::Gui(QWidget* apParent)
    : QMainWindow(apParent)
{
    setWindowTitle("Titel");
    setFixedSize(800,600);
    
    mainWidget = new mainPage;
    setCentralWidget(mainWidget);
    show();
} 
Ich nehme doch mal an, das mainPage in deinem Hauptfenster angezeigt werden soll.

Verfasst: 9. Dezember 2009 16:07
von danmor
Die Gui Klasse sieht nun folgendermassen aus:

Code: Alles auswählen

Gui::Gui(QWidget* apParent):QMainWindow(apParent){
    setWindowTitle("Titel");
    setFixedSize(800,600);

    mainWidget = new mainPage;
    setCentralWidget(mainWidget);
    show();
}
und die Header Datei so:

Code: Alles auswählen

#ifndef GUI_H
#define GUI_H
#include <QtGui>

class Gui:public QMainWindow{
    Q_OBJECT
public:
    Gui(QWidget *apParent=0);
    ~Gui();
private:
    QMainWindow* mainWindow;
    QWidget* mainWidget;
    QVBoxLayout* mainLayout;
};

#endif // GUI_H
trotzdem bleibt alles noch beim alten... Ich hoffe ich strapaziere deine Nerven nicht zu sehr und bin dir sehr dankbar für deine Bemühungen!

Verfasst: 9. Dezember 2009 16:17
von archer
Du tust deine Buttons alle in startWidget, un wo tust du startWidget in mainPage hin?
Tu das Layout doch direkt nach mainPage, setLayout(startLayout);
Und du kannst das This-> auch weglassen.

Code: Alles auswählen

mainPage::mainPage(QWidget *parent)
    : QWidget(parent)
{
    qWarning("start in mainPage::");
    
    startLayout = new QHBoxLayout(this);

    QLabel* lblTitle = new QLabel("Titel");

    QPushButton* btnGame = new QPushButton("");
    btnGame->setFixedSize(380,80);
    connect(btnGame, SIGNAL(clicked()), this, SLOT(onGame()));

    QPushButton* btnHighscore = new QPushButton("");
    btnHighscore->setCursor(QCursor(Qt::PointingHandCursor));
    connect(btnHighscore, SIGNAL(clicked()), this, SLOT(onHighscore()));

    QSpacerItem* verticalSpacer = new QSpacerItem(10, 10, QSizePolicy::Fixed, QSizePolicy::Fixed);
    startLayout->addWidget(lblTitle);
    startLayout->addItem(verticalSpacer);
    startLayout->addWidget(btnGame);
    startLayout->addWidget(btnHighscore);
    startLayout->addItem(verticalSpacer);
}

Verfasst: 10. Dezember 2009 11:04
von danmor
Herzlichen Dank, bis jetzt funktioniert nun alles tiptop!
Ein Frage hätte ich (momentan) aber leider noch.
Wenn ich nun im mainWindow den Inhalt ändern will, muss ich dann ein neues centralWidget setzen oder wie gehe ich vor?

Vielen Dank für die Hilfe!

Verfasst: 10. Dezember 2009 11:30
von archer
Kommst darauf an was du ändern willst, wie dein Konzept aussieht.

Sieh dir mal
QStackedLayout
QStackedWidget
QTabWidget
...
an.

Blätter in der Doku!

Verfasst: 10. Dezember 2009 11:38
von danmor
Okay, das sieht genau danach aus.

Herzlichen Dank für deine Hilfe!

Verfasst: 10. Dezember 2009 11:46
von franzf
Wobei "Inhalt ändern" sich eher nach Ändern von Text auf Labels oder in QTextEdits und der Gleichen anhört.
Das machst du mit SIGNAL/SLOT. Oder eben direkten Funktionsaufrufen.