qt/cpp: generelles problem mit klassen



  • #ifndef stats_h
    #define stats_h
    
    #include <qlcdnumber.h>
    #include <qtimer.h>
    #include "form1.h"
    
    class TCounter : public QLCDNumber
    {
       Q_OBJECT
    
       public:
          TCounter( QWidget * parent = 0, const char * name = 0);
    
          int getTime();
          QTimer timer;
    
      private:
          int timer_value;
    
       public slots:
          void timeout();
          void startTimer();
          void stopTimer();
          void setTime(int t);
    };
    
    #endif //lcd.h
    

    angenommen das ist meine lustige klasse 👍 dann kann ich damit ein kleines lcdfenster öffnen.
    mein problem ist, dass wenn ich ein einfaches lcd schon in einem andeen fenster definiert (zum beispiel im designer) habe, ich nicht auf die memberfunktionen des oberen beispiels zugreifen kann. das ist gleichzeitig auch meine frage!
    angenommen ihr habt in der klasse "gui" ein lcd namens "timer" dem wollt ihr mit oberen member "setTime" ein wert geben... wie macht man das??
    ich war mir unsicher ob linux oder cpp??



  • exigo schrieb:

    angenommen das ist meine lustige klasse 👍 dann kann ich damit ein kleines lcdfenster öffnen.
    mein problem ist, dass wenn ich ein einfaches lcd schon in einem andeen fenster definiert (zum beispiel im designer) habe, ich nicht auf die memberfunktionen des oberen beispiels zugreifen kann. das ist gleichzeitig auch meine frage!

    dh: du hast dir was in designer gezeichnet?
    dann ist der "normale" weg, dass du die klasse vom designer subclassed und dann damit arbeiten kannst.

    angenommen ihr habt in der klasse "gui" ein lcd namens "timer" dem wollt ihr mit oberen member "setTime" ein wert geben... wie macht man das??
    ich war mir unsicher ob linux oder cpp??

    der "normale" weg (auch hier) ist, dass du dich auf das object connectest und bei div. änderungen (Signalen) informiert wirst. (schau mal in die qt docu, da sind beispiele)

    -> was hat linux mit cpp zu tun? der linux kernel hat genau GAR NICHTS mit cpp zu tun!

    hth

    PS: bitte hör mit dem "angenommen" auf!



  • -> was hat linux mit cpp zu tun? der linux kernel hat genau GAR NICHTS mit cpp zu tun!

    entschuldige ich meinte das forum!

    nun, ich weiß wirklich nicht direkt wie ich mein problem lösen kann:

    int main(int argc, char** argv)
    { 
        QApplication a( argc, argv );
        Form1 w;
    
        TCounter T;
        a.setMainWidget( &w );//le problem
        T.show();
    
        //QObject::connect(w.pushButton1, SIGNAL(clicked() ), &w, SLOT(playSound() ) );
        QObject::connect( w.slider1, SIGNAL(sliderMoved(int)), &T, SLOT(setTime(int)));
        QObject::connect( w.pushButton1, SIGNAL(clicked() ), &T, SLOT(startTimer()));
        QObject::connect( w.pushButton2, SIGNAL(clicked() ), &T, SLOT(stopTimer() ) );
    
        w.show();
        a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
        return a.exec();
    
           //Tray
      /* KSystemTray* tray = new KSystemTray(&window, "Hallo");
       tray->setPixmap(QPixmap("tray.png"));
       tray->show();*/
    }
    

    meine main zeigt iwe ich schon ein paar connections mit anderen klassen gemacht habe, allerdings kann ich nicht einen anderen lcd zu diesem verhalten bringen.
    irgendwie muss es doch eine möglichkeit geben dieses abgeleitete widget in meine hauptklasse zu packen, also ohne seperates fenster!



  • hallo,

    ich verstehe ehrlich gesagt dein problem NICHT genau.

    du rufst also mit obigem code deine form1 auf und zeigst sie so an.

    du könntest nun eine klasse "Form1Controller" schreiben, welche NUR auf public set/get methoden deiner form1 zugreift. das wär vom MVC (Model-View-Controller) her schon mal ein anfang.
    weiters connected sich dein controller auf div. signale der form1 und wird so informiert, wenn du es möchtest.
    deine "main.cpp" ruft folgendermaßen auf:
    Form1Controller *ctl = new Form1Controller();
    ctl->setUi(new Form1());

    dh: der controller kriegt eine referenz auf die ui und kann so auf set/get methoden zugreifen. wenn du es noch besser machen willst, dann mach ein interface UiMainView und definiere dort deine set/get methoden. die Form1 implementiert diese und der controller kann dann auch andere UIs verarbeiten, welche eben genau diese schnittstelle besitzen.

    oder gehts dir nur ums zusammenspiel zwischen kdevelop und kdesigner?
    - http://www.htu.tugraz.at/~herwig/qt-designer/
    - http://developer.kde.org/~larrosa/visualtutorial/chapter04.html
    kur gesagt:
    a) Erstelle eine .ui in kdevelop mit dem automake manager.
    b) bearbeite deine ui und erstelle slots usw im designer
    c) subclasse via kdevelop deine ui und implementiere die funktionen
    d) that's it - im großen und ganzen

    hth,
    ciao



  • danke klingt schonmal interessant.
    das genaue problem ist, das wenn ich meine anwendung öffne sich zwei fenster öffnen, mein tcounter lcd und mein anderes mit dem ich mein lcd verändern kann.
    ich habe allerdings ein lcd im hauptfenster und wollte dies entweder mit der klasse tcounter ersetzen, oder es mit den methoden der tcounter klasse ansprechen damit es funktioniert.



  • ich wäre für ein beispiel sehr dankbar, deshalb könnte ich ja mal das paar kilobyte große projekt senden.... und dann die lösung posten!
    mail: slash-ex@web.de

    mfg/hoffnungsvoll 🙄



  • cpp = C PreProcessor!



  • zum eigentlichen thema:
    wie würdet ihr ein lcd "lCDNumber1" in der form1.ui. projekt klasse zum runtercounten bewegen(mit der klasse, dieser implem:

    #include "lcd.h"
    #include "form1.h"
    #include <qmessagebox.h>
    #include <qlcdnumber.h>
    
    void TCounter::setTime(int t)
    {
       timer_value = t; 
       display(t);
       //return 0;
    }
    
    int TCounter::getTime()
    {
      return timer_value;    
    }
    
    void TCounter::startTimer()
    {
       timer.start(60000, false);   
    }
    
    void TCounter::stopTimer()
    {
       timer.stop(); 
    }
    
    TCounter::TCounter( QWidget * parent, const char * name)
       : QLCDNumber(3, parent, name)
    {
       //display(getTime() );
       setDecMode();
       connect( &timer, SIGNAL(timeout()), this, SLOT(timeout()));
       //timer.start(1000, false);
    }
    
    void TCounter::timeout()
    {
       display( intValue() -1);
       if (intValue() == 0) {
          timer.stop();
          Form1 F;
          F.playSound();
          F.lCDNumber1->display(0);
       }
    }
    

    könnte nich mal jemand den code posten, wenn ichs wüsste würd ich nicht fragen?!
    ich denke der code müsste in der oben gepost. main, wenn ihr euch fragt was playSound ist, es steht in der fast leeren form.ui.h und spielt nach ablauf ein wav.



  • ok - ich schreib dir mal a kl. beispiel.

    ciao



  • Anm.: Habe hier einige OT-Posts gelöscht, ich hoffe niemand fühlt sich ans Bein gepinkelt, aber das war einfach zu chaotisch und unübersichtlich.

    Nur kurz noch hierzu:

    hephaistos6 schrieb:

    exigo schrieb:

    ich war mir unsicher ob linux oder cpp??

    -> was hat linux mit cpp zu tun? der linux kernel hat genau GAR NICHTS mit cpp zu tun!

    hephaistos6: Es war eigentlich recht klar, was der OP meint und Deine Antwort hatte mit dem Original-Topic noch wesentlich weniger zu tun als "Linux mit C++". 😉



  • nman schrieb:

    hephaistos6: Es war eigentlich recht klar, was der OP meint und Deine Antwort hatte mit dem Original-Topic noch wesentlich weniger zu tun als "Linux mit C++". 😉

    jo, wenns so klar gewesen wär, dann hätt ich es wohl nicht geschrieben. sorry 🙂

    mittlerweile hab ich ihm ein example geschickt.

    cheers



  • danke 😃


Anmelden zum Antworten