[QT] Programm auf mehrere Klassen aufteilen [Gelöst]



  • Hallo zusammen,

    ich würde gerne wissen wie ich ein Programm auf mehrere KLassen aufteile. Nehmen wir als Beispiel dieses Programm.

    #include <QtGui/QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    private slots:
        void pushGer();
        void pushWorld();
    };
    
    #endif // MAINWINDOW_H
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        ui->labelGer->setText(" ");
        ui->labelWorld->setText(" ");
        ui->pushButtonGer->setText("Germany");
        ui->pushButtonWorld->setText("World");
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::pushGer()
    {
        ui->labelGer->setText("Hello Germany");
    }
    
    void  MainWindow::pushWorld()
    {
        ui->labelWorld->setText("Hello World");
    }
    

    Wie ist es nun möglich das man zwei weitere KLassen hat und in diesen sind, die Funktionen pushGer() bzw. pushWorld() ?

    Ich möchte das Programm gerne aufteilen, damit ich später bei größeren Programm, das Programm übersichtlicher gestallten kann.

    Vielen Dank für eure Hilfe.

    Mfg SeTTek



  • Hallo, bitte verstehe mich nicht falsch, aber eigentlich sind das Grundlagen die du zwingend Wissen solltest bevor du dich mit GUI Programmierung beschäftigst.
    Wie dem auch sei, du mußt eigentlich nur die weiteren Klassen definieren, dort entweder nur das Label oder eventuell den ui Pointer übergeben und kannst dann das Label anpassen. Ist jetzt mal so im groben die vorgehensweise.



  • Ich habs mal versucht, weiß aber noch nicht genau wie es geht.

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    private slots:
        void pushGer();
    
    };
    
    #endif // MAINWINDOW_H
    
    #ifndef WORLD_H
    #define WORLD_H
    
    #include <QMainWindow>
    #include "mainwindow.h"
    namespace Ui {
        class MainWindow;
    }
    class world : public QMainWindow
    {
        Q_OBJECT
    public:
        explicit world(MainWindow*);
    
    signals:
    
    public slots:
        void pushWorld();
    private:
        MainWindow *myWindow;
    
    };
    
    #endif // WORLD_H
    
    #include <QtGui/QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "world.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        ui->labelGer->setText(" ");
        ui->labelWorld->setText(" ");
        ui->pushButtonGer->setText("Germany");
        ui->pushButtonWorld->setText("World");
    
        world *myWorld = new world(this);
    
        connect(ui->pushButtonWorld,SIGNAL(clicked()),myWorld,SLOT(pushWorld()));
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::pushGer()
    {
        ui->labelGer->setText("Hello Germany");
    
    }
    
    #include "world.h"
    
    world::world(MainWindow *myMainWindow)
    
    {
       myWindow = myMainWindow;
    }
    
    void world::pushWorld()
    {
        myWindow->labelWorld->setText("Hello World");
    }
    

    Ich habe über connect dem pushButtonWorld, die entsprechende Funktion aus der Klasse zugewiesen.

    Ich bin mir aber noch nicht sicher, wie ich die den Pointer auf die Klasse World erstellen und dabei den Pointer auf die Klasse MainWindow übergeben, damit ich auf das UI zugreifen kann.

    Denn er findet hiebei unter myWindow das Label labelWorld nicht.

    void world::pushWorld()
    {
        myWindow->labelWorld->setText("Hello World");
    }
    

    --------------------------------------------------------------------------------------------------------------------------------------------

    Habs nun hinbekommen, erstens muss ich nen Pointer auf Ui übergeben und nicht auf die Klasse, wie es guenni81 schon gesagt hatte. Dies war mit aber nicht ganz klar, wie es funktioniert. Nun durch weiteres googeln hab ichs dann geschafft.

    Hier die Lösung für andere mit dem selben Problem.

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    private slots:
        void pushGer();
    
    };
    
    #endif // MAINWINDOW_H
    
    #ifndef WORLD_H
    #define WORLD_H
    // Einbinden damit die Hauptklasse gefunden wird.
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMainWindow>
    
    class MainWinow;
    
    class world : public QMainWindow
    {
        Q_OBJECT
    public:
        // Ein Pointer auf das Ui wird übergeben.
        explicit world( Ui::MainWindow *dasUi);
    
    signals:
    
    public slots:
        void pushWorld();
    
    private:
        // Ein Ui-Pointer in derm nacher der Pointer gespeichert wird.
        Ui::MainWindow *UiVonMain;
    
    };
    
    #endif // WORLD_H
    
    #include <QtGui/QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "world.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
    
        ui->setupUi(this);
        ui->labelGer->setText(" ");
        ui->labelWorld->setText(" ");
        ui->pushButtonGer->setText("Germany");
        ui->pushButtonWorld->setText("World");
    
        // Erstellen eines Pointer auf die Klasse World, bei der der Pointer auf das Ui übergaben wird.
        world *myWorld = new world(ui);
        // Durch connect wird der Button mit der Funktion aus der Klasse World verbunden.
        connect(ui->pushButtonWorld,SIGNAL(clicked()),myWorld,SLOT(pushWorld()));
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::pushGer()
    {
       ui->labelGer->setText("Hello Germany");
    
    }
    
    #include "world.h"
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    // Ui-Pointer wird übergeben und im eigendem Pointer gespeichert.
    world::world(Ui::MainWindow *dasUi)
    
    {
        UiVonMain = dasUi;
    }
    
    void world::pushWorld()
    {
       UiVonMain->labelWorld->setText("Hello World");
    }
    

    Wenn noch irgendwelche Fehler drin sind, ober Wege es besser zu machen bitte melden.



  • He, Klasse. Da war ich dann nen Tick zuspät, aber freut mich das du es selbst lösen konntest. 🙂


Anmelden zum Antworten