2012-04-11 9 views
1

Sorry für den vagen Titel.Subclassing Q (Double) SpinBox: reinitialisieren valueFormText() und validate()

Wenn ein Wert in eine Q (Double) SpinBox eingegeben wird, die außerhalb des Bereichs liegt (z. B. Eingabe von "100", wenn max 90 ist), wird der Wert zurückgewiesen und stattdessen der letzte gültige Wert zurückgegeben die SpinBox.

Ich möchte dieses Verhalten ändern, um Werte außerhalb des Bereichs eingeben zu können, die automatisch korrigiert werden (entweder auf das Minimum oder auf das Maximum), da es sonst für den Benutzer dumm wäre, den Wertebereich zu erraten. Nach dem Studium der Dokumente und des Quellcodes von QT entschied ich mich, QSpinBox (wird sich später mit der Double-Variante befassen) in "QSpinBoxFS" zu untergliedern und beide im Titel erwähnten Methoden neu zu implementieren. Irgendwie hat das überhaupt keinen Effekt, das Verhalten ist immer noch das gleiche.

Das sind meine Methoden:

QValidator::State QSpinBoxFS::validate(QString &input, 
             int &pos) 
{ 
    QIntValidator *validator = new QIntValidator(); 
    return validator->validate(input, pos); 
} 

int QSpinBoxFS::valueFromText(const QString &text) 
{ 
    const int max = maximum(); 
    const int min = minimum(); 

    QString copy = text; 
    int dummy = 0; 

    QValidator::State state = validate(copy, dummy); 

    if (state == QValidator::Acceptable) 
    { 
     bool ok; 
     int num = locale().toInt(text, &ok, 10); 
     if (!ok) { goto bad_text; } 

     if (num < min) { return min; } 
     if (num > max) { return max; } 

     return num; 
    } 
    else 
    { 
     bad_text: 
     return (max > 0) ? min : max; 
    } 
} 

Natürlich ist dies in QSpinBoxPrivate nicht wirklich ausreichend ist getan, um die pedantisch Prüfung :: validateAndInterpret, aber ich will nur das Grundkonzept für jetzt arbeiten. Ich habe versucht, validate() zu ändern, um immer Acceptable zurückzugeben, aber komischerweise würden sich die resultierenden Spinboxen immer noch auf die alte Weise verhalten.

Entweder eine Korrektur meiner eigenen Methoden oder ein anderer Ansatz zu diesem Problem sind willkommen! Vielen Dank für Ihre Zeit.

+1

'goto bad_text;' .... \ * shiver \ * –

+0

Abgesehen davon .. Wenn es nur darum geht, den Wertebereich zu erraten: In einigen unserer Anwendungen bieten wir einen Tooltip mit z der Wertebereich und der gültige Maßstab (z. B. wenn Sie nur Werte eingeben können, die durch 0,1 teilbar sind). Das ist natürlich nicht für jede Anwendung ausreichend. –

+0

@Tim Meyer Cmon, zumindest bleibe ich bei Vorwärtssprüngen nur = P und die Tooltip ist natürlich eine Möglichkeit, aber ich finde es nur seltsam kontraintuitiv, wenn ich einen Wert außerhalb des Bereichs eingabe, und das angezeigt Der Wert springt einfach auf den alten Wert zurück. – Ancurio

Antwort

3

Die Signaturen der Methoden versucht man neu zu implementieren sind:

QValidator::State validate(QString & input,int & pos) const # <- const! 
int valueFromText(const QString & text) const # <- const! 

Beide Ihre Methoden, um die const fehlen, so dass sie verschiedene Methoden und somit nie von der Basisklasse genannt.

+0

Haha, ironischerweise habe ich nur 1min vor deiner Post davon erfahren; D – Ancurio

0

Auf einer anderen Note,

QAbstractSpinButton::setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue) 

kann somehwat ähnliche Ergebnisse erzielen (Typisierung Werte kleiner als min bis min korrigiert werden), obwohl man immer noch von der Eingabe Werten größer als max aufgrund der Validator verhindert werden. (Und deshalb ist es für meine Bedürfnisse nicht ausreichend, lass es nur hier als Referenz.)