MainWindow und Widgets

Alles rund um die Programmierung mit Qt
Antworten
danmor
Beiträge: 12
Registriert: 17. August 2009 22:49

MainWindow und Widgets

Beitrag 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
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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.
danmor
Beiträge: 12
Registriert: 17. August 2009 22:49

Beitrag 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...
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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.
danmor
Beiträge: 12
Registriert: 17. August 2009 22:49

Beitrag 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!
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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);
}
danmor
Beiträge: 12
Registriert: 17. August 2009 22:49

Beitrag 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!
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag 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!
danmor
Beiträge: 12
Registriert: 17. August 2009 22:49

Beitrag von danmor »

Okay, das sieht genau danach aus.

Herzlichen Dank für deine Hilfe!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten