Zwei Fragen zu QT

Dieses Thema im Forum "C/C++" wurde erstellt von Tantalus, 22.09.2004.

  1. #1 Tantalus, 22.09.2004
    Tantalus

    Tantalus Grünschnabel

    Dabei seit:
    17.05.2004
    Beiträge:
    5
    Zustimmungen:
    0
    Also ich hab angefangen Qt zu lernen ,da ist mir aufgefallen, dass für die widgets immer mit new Speicher reserviert wird, aber nicht mit delete wieder freigegeben wird.
    Warum muss dieser bei qt nicht wieder freigegeben werden??

    Meine zweite Frage ist, müsste bei diesem Beispiel nich eine so genannte Endlosschleife auftreten, da das Signal farbeGeaendert(int,int) die methode rgbNeueFarbe(int,int) auslöst , welche wiederum die methode aktualisiereSchiebeLCD(int) aufruft und die methode aktualisiereSchiebeLCD(int) wierderum sendet das Signal farbeGeandert(int,int)
    (Signal farbeGeandert(int,int)->rgbNeueFarbe(int,int)->aktualisiereSchiebLCD(int)->Signal fabeGeandert(int,int)->...).
    Hier das Beispielprogramm aus meinem Buch.
    PHP:
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qslider.h>
    #include <qlcdnumber.h>
    #include <qlabel.h>
    #include <qerrormessage.h>
    //........................................................ Klasse SchiebLCD
    class SchiebLCD : public QWidget {
       
    Q_OBJECT   // notwendig, da eigene Slots enthalten sind
    public:
       
    SchiebLCD(int obenint nrQWidget *parent, const chartext)
                                                        : 
    QWidget(parenttext) {
          
    nummer nr;
            
    //................ Erzeugen eines Text-Labels
          
    QLabelname = new QLabelthis );
          
    name->setTexttext );
          
    name->setGeometry1101530 );
            
    //................ Erzeugen eines Schiebebalken
          
    schiebbalk = new QSlider0oben// min-/max-Wert
                                    
    10,    // Schrittweite u. Startwert
                           
    QSlider::Horizontalthis ); // Ausrichtung u. Elternwidget
          
    schiebbalk->setGeometry201020030 );
            
    //................ Erzeugen einer LCD-Anzeige
          
    lcdzahl = new QLCDNumber3this ); // maximal 3 Ziffern
          
    lcdzahl->setGeometry220106030 );
          
    lcdzahl->display);
            
    //................ Verbinde Schiebebalken und LCD-Anzeige
          
    QObject::connectschiebbalkSIGNALvalueChanged( int ) ), 
                            
    thisSLOTaktualisiereSchiebLCD( int ) ) );
       }
    signals:
       
    void farbeGeaendertint nrint wert );
    public 
    slots:
       
    void aktualisiereSchiebLCDint wert ) {
          
    schiebbalk->setValuewert );
          
    lcdzahl->displaywert );
          
    QErrorMessage *meldung = new QErrorMessage(this);
          
    meldung->message("Test");
          
    emit farbeGeaendertnummerwert ); // Signal farbeGeaendert schicken
       
    }
    private:
       
    int         nummer;
       
    QSlider*    schiebbalk;
       
    QLCDNumberlcdzahl;
    };
    //...................................................... Klasse farbeRgbHsv
    class farbeRgbHsv : public QWidget {
       
    Q_OBJECT   // notwendig, da eigene Slots enthalten sind
    public:
       
    farbeRgbHsvQWidget *parent ) : QWidgetparent ) { //... Konstruktor
          
    int i;
            
    //................ Initialisierungen
          
    for ( i=0i<3i++)
              
    rgbFarbe[i] = 0;
            
    //................ Erzeugen einer Farbanzeige
          
    farbAnzeige = new QLabelthis );
          
    farbAnzeige->setGeometry33030200370 );
            
    //................ Erzeugen von drei Schiebealken fuer RGB
          
    const char rgbText[] = { "R""G""B" };
          for ( 
    i=0i<3i++ ) {
             
    rgb[i] = new SchiebLCD255ithisrgbText[i] );
             
    rgb[i]->setGeometry1030+i*5030060 );
             
    QObject::connectrgb[i], SIGNALfarbeGeaendertintint ) ), 
                               
    thisSLOTrgbNeueFarbeintint ) ) );
          }
            
    //................ Erzeugen von drei Schiebealken fuer HSV
          
    const char hsvText[] = { "H""S""V" };
          for ( 
    i=0i<3i++ ) {
             
    hsv[i] = new SchiebLCDi==359 255i+3thishsvText[i] );
             
    hsv[i]->setGeometry10250+i*5030060 );
             
    QObject::connecthsv[i], SIGNALfarbeGeaendertintint ) ), 
                               
    thisSLOThsvNeueFarbeintint ) ) );
          }
          
    rgb[0]->aktualisiereSchiebLCD255 ); // FЭr Farbenanzeige (rot) zu Beginn
       
    }
    public 
    slots:
       
    void rgbNeueFarbeint nrint wert ) { //... rgbNeueFarbe
          
    if ( rgbFarbe[nr] != wert ) {
             
    int  hsv;
             
    rgbFarbenr ] = wert
             
    QColor neueRgbFarbergbFarbe[0], rgbFarbe[1], rgbFarbe[2] );
             
    farbAnzeige->setPaletteBackgroundColorneueRgbFarbe );
             
    neueRgbFarbe.getHsv( &h, &s, &);
             
    hsv[0]->aktualisiereSchiebLCDhsvFarbe[0] = );
             
    hsv[1]->aktualisiereSchiebLCDhsvFarbe[1] = );
             
    hsv[2]->aktualisiereSchiebLCDhsvFarbe[2] = );
          }
       }
       
    void hsvNeueFarbeint nrint wert ) { //... hsvNeueFarbe
          
    if ( hsvFarbe[nr-3] != wert ) {
             
    int rgb;
             
    hsvFarbenr-] = wert
             
    QColor neueHsvFarbehsvFarbe[0], hsvFarbe[1], hsvFarbe[2], QColor::Hsv );
             
    farbAnzeige->setPaletteBackgroundColorneueHsvFarbe );
             
    neueHsvFarbe.getRgb( &r, &g, &);;
             
    rgb[0]->aktualisiereSchiebLCDrgbFarbe[0] = );
             
    rgb[1]->aktualisiereSchiebLCDrgbFarbe[1] = );
             
    rgb[2]->aktualisiereSchiebLCDrgbFarbe[2] = );
          }
       }
    private:
       
    QLabel    *farbAnzeige;
       
    int       rgbFarbe[3], hsvFarbe[3];
       
    SchiebLCD *rgb[3],     *hsv[3];
    };
    #include "farbe.moc"
    //.................................................................... main
    int mainint argccharargv[] ) {
       
    QApplication myappargcargv );
       
       
    farbeRgbHsvmywidget = new farbeRgbHsv);
       
    mywidget->setGeometry100100540450 );
      
       
    myapp.setMainWidgetmywidget );
       
    mywidget->show();
       return 
    myapp.exec();
    }
    Wenn man es kompiliert ensteht keine Endlosschleife, aber ich vesteh nicht warum.
    Ich hoffe ihr könnt mir helfen.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 danielgoehl, 25.09.2004
    danielgoehl

    danielgoehl Lehrling

    Dabei seit:
    12.01.2003
    Beiträge:
    96
    Zustimmungen:
    0
    Ort:
    Maastricht
    Die endlosschleife die du suchst wird durch myApp.exec() gestartet!!
    Sie ist in QT salop gesagt schon "vor-programmiert".

    Wie das mit dem Speichermanagment bei QT aussieht, kann ich dir leider nicht sagen. Aber du neuen Speicher mit new allokierst, warum gibts du ihn im Destructor deines Objekt nicht wieder frei???

    Gruß daniel
     
  4. pinky

    pinky König

    Dabei seit:
    11.08.2004
    Beiträge:
    795
    Zustimmungen:
    0
    Also das mit der Endlosschelief ist so, wenn ich dein programm richtig verstehe.

    Du änderst einen Schieberegler -> aktualisiereSchiebLCD( int ) wird aufgerufen -> emit farbeGeaendert( nummer, wert ) -> rgbNeueFarbe( int, int ) wird aufgerufen -> die Schieberegler werden neu gesetzt, aber auf den Wert den sie schon hatten, da der ja von der aktion des verschiebens kam, daduch wird kein erneutes valueChanged() Signal gesendet.
     
Thema:

Zwei Fragen zu QT

Die Seite wird geladen...

Zwei Fragen zu QT - Ähnliche Themen

  1. Zwei Fragen: Computer Netzwerk via WLAN einrichten / Bildschirmauflösung ändern

    Zwei Fragen: Computer Netzwerk via WLAN einrichten / Bildschirmauflösung ändern: Hallo, zwei dämliche Fragen auf die ich noch keine Antwort finden konnte. r Ich habe nie Glück im Thema Netzwerk einrichten, ich würde gerne...
  2. Zwei Fragen 1. zu OpenVPN und 2. zu Logfiles

    Zwei Fragen 1. zu OpenVPN und 2. zu Logfiles: Hi, habe seit kurzem ein neues Spielzeug :brav: Seagate FreeAgent DockStar. [GELÖST Danke @ Ulix] Leider habe ich noch nicht viel mit...
  3. Script mit find und xargs. Zwei fragen

    Script mit find und xargs. Zwei fragen: Hallo leute ich bin mal wieder dabei ein wenig mit der bash herumzuspielen. Wenn ich folgendes eingebe find /usr/ -type f -name README...
  4. Abfragen über zwei oder mehr Tabellen

    Abfragen über zwei oder mehr Tabellen: Nabend. Ich hab heut in der Schule mal wieder SQL-Datenbanken gehabt, und schon jukt es mich wieder in den fingern. Es handelt sich nich um...
  5. Zwei Fragen zu Evolution.

    Zwei Fragen zu Evolution.: Hi zusammen, Zwei Fragen zu Evolution: 1.) Ich möchte ich meine Evolution(Vers. 2.0.4) Kontakte einzeln sichern. Ich kann zwar alle auswählen...