Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Qt: Button pressed + QTimer

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Question Qt: Button pressed + QTimer

    Hi leute,

    Ich bin's wieder. Ich bin dabei ein doubleBox (QSpinBox nur mit komma) zu bauen. daführ habe ich QLineEdit und 2 buttons genommen. Alles funktioniert soweit. Das Problemm ist, wenn ich auf Button drücke und nicht löslasse, ändert sich der zahl nur ein mal. Ich wollte das Zahl in meinem lineEdit sich wieter ändert. Ich habe es so ausprobiert:
    Code:
    void myDoubleBox::upPressed() // Pressed signal wird hierher geleitet
    {
        for (double i = currentValue(); i < maxValueD; ++i)
        {
    	QTimer::singleShot( 500, this, SLOT( upValue() )); // upValue() ist derzeitige nummer + 0.1
        }
    }
    klappt nciht wie kann ich das sonst machen?

    Danke im Voraus

    chapaev

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich würde das eher so versuchen:

    Vermutlich hast du eine feste Präzission, d.h. du könntest auch einen entsprechend großen Integer in deiner Spinbox anzeigen.

    D.h. man könnte ein QSpinBox ableiten, entsprechend große int Werte benutzen, aber mapValueToText und Freunde überschreiben, so daß Fließkomma zahlen im Text stehen.

    Noch ein weiteres signal das den double Wert emittet, fertig.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Vermutlich hast du eine feste Präzission, d.h. du könntest auch einen entsprechend großen Integer in deiner Spinbox anzeigen.

    D.h. man könnte ein QSpinBox ableiten, entsprechend große int Werte benutzen, aber mapValueToText und Freunde überschreiben, so daß Fließkomma zahlen im Text stehen.
    Ich habe zwar nciht alles verstanden, aber du meinst bestimt das, was im Qt buch steht. So wollte ich anfangs machen, aber das klappt nciht so wie es im Buch steht. Ich habe den Beispiel von cd kopiert und kompiliert so wie es ist, funktioniert nciht. Warscheinlich liegt an dem Unterschied zwischen Qt versionen. Auserdem kann man in QSpinBox den 0.1 Schritt ncit einstellen. Qt 4 hat so ein widget aber..... ich habe Qt3 und will im Moment nciht umsteigen.

    Ich bin mit meinem widget zufrieden. Das einzige was noch nciht klappt, ist das was ich beschrieben habe. (Wenn button gedrückt ist wiederholt sich der vorgang upValue() immer wieder)

    MfG

    chapaev

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Hmmm... Kann mir jemand sagen warum das so nicht klappt? (das programm hängt sich auf)
    Code:
    void myDoubleBox::upPressed() //wenn das Button "upBtn" gedrückt wird
    {
        for (int i = 0; upBtn->isDown(); ++i) // int i = 0 habe ich nur eingebaut,
        // damit diese Schleife auch funktioniert ;)
        {
    	QTimer::singleShot( 500, this, SLOT( upValue() )); 
            // Timer damit das Wert nicht direckt auf maximum springt
            // upValue funktion guckt automatisch nach ob der Wert schon auf maximum steht,
            // wenn nciht dann macht die ein Schrit
        }
    }
    Von Logic her sollte es doch fuktionieren oder?

    chapaev

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Kommt drauf an, was du erreichen willst.

    Wenn du erreichen willst, daß unendlich viele Timer Events in der EventLoop landen, dann funktioniert das so

    Ich weiß leider nicht, welches Beispiel du als Grundlage genommen hast, aber Tatsache ist, daß man eine Subklasse von QSpinBox machen kann.
    Man kann dann durch überschreiben von virtuellen Methoden (wahnsinn! ) beeinflussen, was im LineEdit der SpinBox steht.

    So kann man zum Bespiel den Wert 1 als "Eins" darstellen, oder als "Nicht 1".
    Man könnte ganz gewagt auch den String nehmen, den (1 / 10.0) formatiert auf eine Nachkommastelle ergibt.

    Man könnte (noch um einiges gewagter) 1 durch den Wert der Variablen ersetzen, den die Methode bekommt.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von chapaev
    Ich habe zwar nciht alles verstanden,
    Du nimmst ein 4-spaltiges Grid (dein Widget) und packst rein:

    QLabel* zahl =new QLabel("Zahl:",p_mygrid); // layout
    QSpinbox* myint=new QSpinbox(0,999,1,p_mygrid); // Ganzzahl
    QLabel komma =new QLabel(',',p_mygrid); // Komma
    QSpinbox* mydecbruch=new QSpinbox(0,9,1,p_mygrid); // Rest*10

    Letztere könntest du auf wrapping setzen, und wenn der wieder auf 0 ist (Signal valueChanged abfangen), den myint eins rauf/runtersetzen (setValue(int)).

    und summierst hinterher
    float alles=myint->value()+float(mydecbruch->value()/10);

    (für negative Werte mal den Algo selbst stricken)

    Wenn du den eleganteren Weg von andaskoa nehmen willst, musst du eine Subklasse von QSpinBox erstellen, weil die benötigten Funktionen mapTextToValue und mapValueToText protected sind.
    Ich habe aber keine Ahnung, ob das Ganze dann schnell genug reagiert durch die Umformatiererei und würde letzteres nur für einen begrenzten Wertebereich einsetzen.

    Hoffe, dass das Ganze etwas klarer geworden ist.

    so long,
    BlueJay

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •