[gelöst] Hexadezimale QSpinBox: Segfault im Validator mit...

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

[gelöst] Hexadezimale QSpinBox: Segfault im Validator mit...

Beitrag von qmaddin »

Alter Titel: Hexadezimale QSpinBox: Segfault im Validator mit setPrefix()

Hallo,

ich hätte gerne eine SpinBox, die hexadezimale Werte zählt.
Ich habe folgenden funktionierenden Code. Nun hätte ich aber gerne 0x davor stehen, damit der Anwender weiß, dass er den Wert hexadezimal eingeben muss.
Sobald ich aber in HexSpinBox.cpp das setPrefix("0x") entkommentiere, bekomme ich einen Segfault im validator.
Was muss ich anpassen bzw. wo liegt hier der Hund begraben? Ist der RegEx falsch?

Danke schonmal,
QMaddin

Code: Alles auswählen

//HexSpinBox.h
#include <QSpinBox>

class QRegExpValidator;

class HexSpinBox : public QSpinBox {
   Q_OBJECT

public:
   HexSpinBox(QWidget *parent = 0);

protected:
   QValidator::State validate(QString &text, int &pos) const;
   int valueFromText(const QString &text) const;
   QString textFromValue(int value) const;

private:
   QRegExpValidator *validator;
};

Code: Alles auswählen

//HexSpinBox.cpp
#include <QSpinBox>
#include <QDebug>
#include "HexSpinBox.h"

HexSpinBox::HexSpinBox(QWidget *parent /* = 0 */) : QSpinBox(parent) {
   setRange(0, 0xFFFF);
   //setPrefix(QString("0x")); // Fehler
   validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,4}"), this);
}

QValidator::State HexSpinBox::validate(QString &text, int &pos) const {
   qDebug() << text << ";" << pos;
   return validator->validate(text, pos);
}

QString HexSpinBox::textFromValue(int value) const {
   qDebug() << "textFromValue" << value;
   return QString::number(value, 16).toUpper();
}

int HexSpinBox::valueFromText(const QString &text) const {
   bool ok;
   qDebug() << "valueFromText"  << text << text.toInt(&ok, 16) << ";" << ok;
   return text.toInt(&ok, 16);
}

Code: Alles auswählen

//main.cpp
#include <QApplication>
#include "HexSpinBox.h"

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);
   HexSpinBox *spinbox = new HexSpinBox;
   spinbox->show();
   return app.exec();
}
Zuletzt geändert von qmaddin am 21. September 2009 14:47, insgesamt 1-mal geändert.
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Hallo,
kann jemand diesen Fehler bestätigen oder mir erklären, wo er herkommt?
Danke,
QMaddin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich kann es bestätigen, kann aber auch sagen dass es mit 2 Minute debuggen klar ist wohl der Fehler ist. Also würde ich sagen - versuch dein Glück mal mit dem Debugger
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Hallo Christian,
Danke für deine Antwort!

Ich habe gdb mal drauf angesetzt, aber leider kann ich in das validator->validate(), wo der Fehler auftritt, nicht hineingehen. Scheinbar sind die Debugging-Symbols nicht verfügbar. Aber leider ist der Festplattenplatz von meinem Netbook voll...

Kannst du mir bitte sagen, wo das Problem hier liegt?
Ist vielleicht der RegEx falsch?

Grüße,
Martin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du schon siehst dass es dort crasht - hast Du mal überlegt und geschaut was in validator drin steht?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Hm... Seltsam...
validator wird in dem Fall, wo ich das setPrefix() aufrufe, ein Null-Pointer.
Aber validator steht doch in keiner Verbindung zu dem setPrefix()?
Ich komm einfach nicht dahinter...
Danke, QMaddin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann schau Dir endlich mal den Backtrace an!
Des weiteren sieht man ja dass validator *nach* dem Aufruf von setPrefix() initialisert wird...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Ich habe leider nicht die Erfahrung, hier etwas rauslesen zu können... :-(
Ich sehe zwar, in welcher Reihenfolge welche Funktion aufgerufen wird. aber ich weiß jetzt auch nur, dass es in HexSpinBox::validate kracht. Das wusste ich aber auch schon vorher... *verzweifel*

Code: Alles auswählen

#0  0x0804e132 in HexSpinBox::validate (this=0x9306598, text=@0xbfc69594, pos=@0xbfc69598)
    at src/HexSpinBox.cpp:36
#1  0xb7a6b8d6 in QSpinBoxValidator::validate (this=0x92f1788, input=@0xbfc69594, pos=@0xbfc69598)
    at widgets/qabstractspinbox.cpp:1840
#2  0xb7ac8a32 in QLineEditPrivate::finishChange (this=0x92f3a78, validateFromState=-1, 
    update=true, edited=false) at widgets/qlineedit.cpp:2945
#3  0xb7ac883c in QLineEditPrivate::setText (this=0x92f3a78, txt=@0xbfc69698, pos=3, edited=105)
    at widgets/qlineedit.cpp:3016
#4  0xb7acaadb in QLineEdit::setText (this=0x9305668, text=@0xbfc69698) at widgets/qlineedit.cpp:400
#5  0xb7a70b6d in QAbstractSpinBoxPrivate::updateEdit (this=0x9301ab8)
    at widgets/qabstractspinbox.cpp:1675
#6  0xb7b197aa in QSpinBox::setPrefix (this=0x9306598, prefix=@0xbfc6970c)
    at widgets/qspinbox.cpp:286
#7  0x0804e1e9 in HexSpinBox (this=0x9306598, parent=0x0) at src/HexSpinBox.cpp:29
#8  0x080531b2 in SettingsDialog (this=0x9306448, parent=0xbfc6ab48) at src/SettingsDialog.cpp:38
#9  0x08051217 in MainWindow::settings (this=0xbfc6ab48) at src/MainWindow.cpp:127
#10 0x08057612 in MainWindow::qt_metacall (this=0xbfc6ab48, _c=QMetaObject::InvokeMetaMethod, 
    _id=6, _a=0xbfc699cc) at tmp/moc_MainWindow.cpp:86
#11 0xb7461ca8 in QMetaObject::activate (sender=0x92f9650, from_signal_index=5, to_signal_index=6, 
    argv=0xbfc699cc) at kernel/qobject.cpp:3069
#12 0xb74620e0 in QMetaObject::activate (sender=0x92f9650, m=0xb7f11008, from_local_signal_index=1, 
    to_local_signal_index=2, argv=0xbfc699cc) at kernel/qobject.cpp:3163
#13 0xb767e891 in QAction::triggered (this=0x92f9650, _t1=false)
    at .moc/release-shared/moc_qaction.cpp:236
#14 0xb767fe0f in QAction::activate (this=0x92f9650, event=QAction::Trigger)
    at kernel/qaction.cpp:1160
#15 0xb768290b in QAction::event (this=0x92f9650, e=0xbfc69d44) at kernel/qaction.cpp:1079
#16 0xb7684e9c in QApplicationPrivate::notify_helper (this=0x9121208, receiver=0x92f9650, 
    e=0xbfc69d44) at kernel/qapplication.cpp:4084
#17 0xb768d19e in QApplication::notify (this=0xbfc6abbc, receiver=0x92f9650, e=0xbfc69d44)
    at kernel/qapplication.cpp:3631
#18 0xb744ba3b in QCoreApplication::notifyInternal (this=0xbfc6abbc, receiver=0x92f9650, 
    event=0xbfc69d44) at kernel/qcoreapplication.cpp:602
#19 0xb76be298 in QShortcutMap::dispatchEvent (this=0x91212a8, e=0xbfc6a08c)
    at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:213
#20 0xb76c01af in QShortcutMap::tryShortcutEvent (this=0x91212a8, o=0x92e6950, e=0xbfc6a08c)
    at kernel/qshortcutmap.cpp:369
#21 0xb768e440 in QApplication::notify (this=0xbfc6abbc, receiver=0x92e6950, e=0xbfc6a08c)
    at kernel/qapplication.cpp:3673
#22 0xb744ba3b in QCoreApplication::notifyInternal (this=0xbfc6abbc, receiver=0x92e6950, 
    event=0xbfc6a08c) at kernel/qcoreapplication.cpp:602
#23 0xb7685d7e in qt_sendSpontaneousEvent (receiver=0x92e6950, event=0xb71c0140)
    at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:216
#24 0xb7723010 in QKeyMapper::sendKeyEvent (keyWidget=0x92e6950, grab=false, type=QEvent::KeyPress, 
    code=69, modifiers={i = -1077501480}, text=@0xbfc6a204, autorepeat=<value optimized out>, 
    count=<value optimized out>, nativeScanCode=26, nativeVirtualKey=101, nativeModifiers=20)
    at kernel/qkeymapper_x11.cpp:1675
#25 0xb77251de in QKeyMapperPrivate::translateKeyEvent (this=0x915c140, keyWidget=0x92e6950, 
    event=0xbfc6a86c, grab=105) at kernel/qkeymapper_x11.cpp:1645
#26 0xb76fad6e in QApplication::x11ProcessEvent (this=0xbfc6abbc, event=0xbfc6a86c)
    at kernel/qapplication_x11.cpp:3436
#27 0xb7726c6a in x11EventSourceDispatch (s=0x912a900, callback=0, user_data=0x0)
    at kernel/qguieventdispatcher_glib.cpp:146
#28 0xb6eb6b88 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#29 0xb6eba0eb in ?? () from /usr/lib/libglib-2.0.so.0
#30 0xb6eba268 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#31 0xb7477438 in QEventDispatcherGlib::processEvents (this=0x9127010, flags={i = -1077499352})
    at kernel/qeventdispatcher_glib.cpp:323
#32 0xb7726365 in QGuiEventDispatcherGlib::processEvents (this=0x9127010, flags={i = -1077499304})
    at kernel/qguieventdispatcher_glib.cpp:202
#33 0xb744a06a in QEventLoop::processEvents (this=0xbfc6aad0, flags={i = -1077499240})
    at kernel/qeventloop.cpp:149
#34 0xb744a4aa in QEventLoop::exec (this=0xbfc6aad0, flags={i = -1077499176})
    at kernel/qeventloop.cpp:200
#35 0xb744c959 in QCoreApplication::exec () at kernel/qcoreapplication.cpp:880
#36 0xb7684d17 in QApplication::exec () at kernel/qapplication.cpp:3553
#37 0x0804ddd0 in main (argc=Cannot access memory at address 0x21
) at src/main.cpp:46
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Manchmal glaube ich echt die Leute lesen meine Kommentare nicht. Wie wäre es einfach mal den validator-Pointer früher zu initialisieren und dann erst setPrefix() aufzurufen? Wie soll es sonst sein dass der Pointer noch nicht initialisiert ist und es abstürzt???
Member-Variablen initialisiert man in der Initialisierungsliste und nicht erst am Ende des ctors!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Hallo Christian,
Sorry, dass ich es nicht gleich gecheckt habe.
Ich habe das Beispiel aus dem Buch "C++ GUI Programmierung mit Qt4" von Blanchette/Summerfield abgemalt. Alles, was ich gemacht habe war, den setPrefix()-Aufruf zu ergänzen. Ich wusste nicht, dass das setPrefix() auch schon den Validator aufruft...
Herlichen Dank für deine Hilfe!!!
Antworten