Seite 1 von 1

[gelöst] Probleme beim compilen mit QSpinBox

Verfasst: 13. März 2011 23:58
von Label
Nabend!

Ich habe folgendes Problem:
Ich möchte im Prinzip einfach nur ein QWidget mit ein paar QSliders, QSpinBoxes usw. basteln. Das ging auch alles astrein, bis ich ein paar QSpinBoxes bzw. QDoubleSpinBoxes einbauen wollte. Plötzlich sagt mir der Compiler folgende Fehler:

ISO C++ forbids declaration of 'QSpinBox' with no type (qspinbox.h 121)
redefinition of 'class QDoubleSpinBox' (qspinbox.h 126)
previous definition of 'class QDoubleSpinBox' (qspinbox.h 57)

Ich kann mir nicht erklären, woran das liegt, besonders weil ich das selbe Projekt auf einem anderen Rechner mit der gleichen Version von Qt und Qt Creator ohne Probleme kompilieren kann.
Der angebliche Fehler taucht in meiner widget.cpp in Zeile 15 auf. Das ist die Zeile, in der ich QSpinBox einbinde und der Rest des Fehlers spielt sich angeblich in der qspinbox.h ab, was ich mir natürlich nicht vorstellen kann.

Hat jemand eine Idee, woran sich der Compiler da aufregt?

P.S.: Der Fehler taucht auch wirklich NUR bei QSpinBox bzw. QDoubleSpinBox auf. Wenn ich die include-Zeile und die ganzen Instanzen von QDoubleSpinBox auskommentiere, wird ohne weitere Probleme kompiliert.

MfG Label

Verfasst: 14. März 2011 07:53
von franzf
Wie schauts bei deinen Headern mit include-guards aus? Evtl. in deinem widget.h vergessen, und zufällig auch dort schon QSpinBox eingebunden?

Verfasst: 14. März 2011 13:54
von Label
Die header ist ganz normal und kurz:

Code: Alles auswählen

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H
in der .cpp sieht es so aus:

Code: Alles auswählen

#include "widget.h"
#include <QLabel>
#include <QSpinBox>
//... weitere includes

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // ...

    QLabel *label_PS_xLoc = new QLabel("PS x", this);
    QDoubleSpinBox *doublespinbox_PS_xLoc = new QDoubleSpinBox(this);
    doublespinbox_PS_xLoc->setDecimals(3);
    doublespinbox_PS_xLoc->setSingleStep(10);
    doublespinbox_PS_xLoc->setRange(-1000, 1000);

  //...
}

Verfasst: 14. März 2011 14:04
von Label
Wie gesagt, auf meinem Laptop lässt sich das Projekt ohne Probleme übersetzen.
Vielleicht hilft das weiter:
Mein Laptop läuft auf Win XP (da funktioniert es)
meine PC läuft auf Win Vista (hier nicht)

... allerdings habe ich auch noch Ubuntu auf meinem PC drauf. Ich probiere mal ob es sich da übersetzen lässt ...

Verfasst: 14. März 2011 14:09
von franzf
Kannst du dir mal den qspinbox.h-Header vornehmen?
Bei Fehlermeldungen der gehübschten Compiler-Ausgabe modernerer IDEs kann man ja direkt an die Fehlerstelle springen. Evtl. hast du dich so in den qspinbox-Header navigiert und ungewollt darin rumeditiert.
Sicher die qspinbox.h mal weg und ersetz sie durch den Original-Header deiner Qt-Version.

Verfasst: 14. März 2011 14:11
von Label
Ich habe jetzt mal ausprobiert, nur die #include<QSpinBox> auszukommentieren und zu kompilieren. Das funktioniert auch nicht, weil, wie sollte es anders sein, "QDoubleSpinBox was not declared in this scope".

Ich bin mal in die qspinbox.h rein und da wird tatsächlich mehrmals QDoubleSpinBox deklariert. Allerdings steht vor der ersten Deklaration (Zeile 53):

Code: Alles auswählen

#ifndef QT_NO_SPINBOX
ich habe aber noch nicht rausgefunden, wofür das gut ist.

Verfasst: 14. März 2011 14:20
von Label
Ich sehe gerade, dass sich auch die zweite Deklaration von QDoubleSpinBox im

Code: Alles auswählen

#ifndef QT_NO_SPINBOX
...
#endif
Block befindet. Also kann es wahrscheinlich nicht die Ursache sein.

Verfasst: 14. März 2011 14:26
von Label
Sicher die qspinbox.h mal weg und ersetz sie durch den Original-Header deiner Qt-Version.
Danke für den Tipp aber wie komme ich an die Original-Header?
Ich habe ja keine Kopie sämtlicher Qt-Header. Da liegt nur die eine qspinbox.h in meinem Qt-Ordner (bis auf die zwei anderen qspinbox.h, die auf die eine 'richtige' qspinbox.h verweisen)

edit: Die Frage hat sich erledigt, ich habe ja schliesslich noch die header von meinem Laptop ... :roll:

Verfasst: 14. März 2011 14:47
von Label
Danke franzf!
Dein Tip, die header zu tauschen war richtig.

Folgendes hat zu meinem Fehler geführt:
In meinem Projekt wollte ich erst mit normalen QSpinBoxes arbeiten.
Nachdem ich sie schon eingebunden und instanziert hatte, habe ich mitbekommen, dass es wohl besser wäre mit QDoubleSpinBoxes zu arbeiten.
Daraufhin habe ich eines der - meistens hilfreichen - Features der IDE benutzt. In meinem Fall: [Strg] + [Shift] + [R] im QtCreator, und habe einfach meine QSpinBoxes in QDoubleSpinBoxes geändert, ohne zu ahnen, dass QtCreator nicht nur meinen eigenen Quellcode ändert, sondern auch die Deklaration der QSpinBox in der qspinbox.h in eine QDoubleSpinBox ändert.
So schnell kann es gehen ...