QT CREATOR Eigene Klasse mit PushButton verbinden "connect()"



  • Hallo an alle,

    ich hab mit dem QT Creator (mit Assistent) eine simple GUI erstellt. Signale und Slots sind gesetzt (klick and drop). Jetzt würde ich aber gerne eine eigene Klasse mit einem push button verbinden. Wie der connect() Befehl lauten muss weiß ich, ich komme aber nicht an den Push Button ran. Kann mir das bitte jemand versuchen zu erklären?

    Main sieht so aus:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    

    Soweit ich das sehen kann muss der button in w sein. Da finde ich ihn aber unter seinem Namen nicht.

    Dankeschön



  • mir ist nicht ganz klar, was du meinst, aber ich versuch mal zu raten:

    Du hast in dein MainWindow über den grafischen Editor einen PushButton eingefügt und hättest jetzt gerne, dass bei einem Klick auf den Button ein neues Fenster aufgeht?

    Vor dem eigentlichen Kompilieren erstellt Qt dir aus dem ui-File (dort sind alle Steuerelemente des Widgets in einer XML-Struktur abgelegt) eine Header-Datei (ui_*.h). Dein MainWindow leitet in der Regel nur von der dort deklarierten Klasse ab oder hält ein Objekt davon als Member (je nachdem, wie du QtCreator diesbezüglich eingestellt hast)

    Bei der ersten Methode hast du in deiner Klasse direkten Zugriff auf die Steuerelemente, da sie in der Basisklasse öffentlich sind.
    Bei der zweiten Methode hast du ein Attribut _ui in deiner Klasse. Über dieses bekommst du Zugriff auf die Steuerelemente

    Ich hoffe, ich konnte weiterhelfen



  • Sorry falls das zuwenig Info war ich wer mal konkret:

    Ich habe eine eigene Klasse Dice, welche von QObject erbt damit ich Slots etc. hab:

    #ifndef DICE_H
    #define DICE_H
    
    #include <QObject>
    
    class Dice : public QObject
    {
    Q_OBJECT
    public:
        explicit Dice(QObject *parent = 0);
        unsigned short int getValue();
        //void roll();
    
    private:
        unsigned short int value;
    
    signals:
    void valueChanged (int);
    public slots:
    void roll();
    };
    
    #endif // DICE_H
    

    Hier meine cpp dazu:

    #include "dice.h"
    #include <cstdlib>
    #include <ctime>
    
    Dice::Dice(QObject *parent) :
        QObject(parent)
    {
    value=1;
    }
    
    void Dice::roll()
    {
        srand(time(NULL));
        value=rand() % 6 + 1;
        emit valueChanged (void);
    
    }
    

    Ich möchte nun in der main() connecten:

    #include <QtGui/QApplication>
    #include "mainwindow.h"
    #include "dice.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        Dice wuerfel;
        QObject::connect(&wuerfel,SIGNAL(valueChanged(void)),&MEINE PROGRESSBAR,SLOT(valueChanged(int))); //Observer
        QObject::connect(&MEINPUSHBUTTON,SIGNAL(clicked(void)),&wuerfel,SLOT(roll(void)));
    
        return a.exec();
    }
    

    &MEINPUSHBUTTON ist hier ein Platzhalter. Ziel ist es das bei einem Klick auf den Pushbutton meine Klasse angeregt wird, die Funktion roll() ausführt und dann anderen meldet das Sie einen anderen Wert hat. Also ein MVC Prinzip.

    Hoffe das ich nun mein Problem besser dargestellt hab.

    Gruß


  • Mod

    Du solltest das in der Klasse Mainwindow machen, würde ich zumindest da anlegen.



  • Genau das hab ich nun gemacht. Jetzt klappts. Der Zugriff geschieht über die ui (siehe Header von mainwindow). Danke für eure Hilfe.


Anmelden zum Antworten