Seite 1 von 1

QT_PROPERTIES gibt undefined referenz zurück

Verfasst: 17. Dezember 2008 20:38
von klopfer667
Hallo,

wenn ich die unten stehenden Dateien kompiliere/linke bekomme ich einen "undefinded referenz" error für die beiden in Q_PROPERTIES definierten Funktionen zurück.
Ich selber sehe keinen Fehler im Programm.
x+2 Augen sehen mehr als 2 für x > 0, darum hier meine Bitte um Hilfe :)

HEADER

Code: Alles auswählen

#include<QObject>
/**
 * @class 	Elementare Daten und Funktionen für eine Punkt auf dem Brett,
 * 			wird in Board() genutzt
 */
class Point : public QObject
{
private:
	Q_OBJECT
	Q_PROPERTY(int color READ getColor WRITE setColor)

public:
	Point();
	~Point();
	int getColor();
	void setColor(int c);
	bool hasCursor();
	void setCursor(bool);
	const static int EMPTY = 0;
	const static int BLACK = 1;
	const static int WHITE = 2;
	void setNumber(int n);
	int getNumber();

private:
	int X;
	int Y;
	int nbr;
	//int color;
	bool CURSOR;
};
CODE

Code: Alles auswählen

#include "Point.h"

Point::Point() {
	// TODO Auto-generated constructor stub
	//color = EMPTY;
	CURSOR = false;
}
/*int Point::getColor()  {
	return color;
}
void Point::setColor(int c) {
	color = c;
}*/

bool Point::hasCursor() {
	return CURSOR;
}

void Point::setCursor(bool c) {
	CURSOR = c;
}

void Point::setNumber(int n) {
	nbr = n;
}

int Point::getNumber() {
	return nbr;
}

Point::~Point() {
	// TODO Auto-generated destructor stub
}
FEHLERMELDUNGEN

Description:
undefined reference to `Point::getColor()' moc_Point.cpp ShGo/debug 68 C/C++ Problem
undefined reference to `Point::setColor(int)' moc_Point.cpp ShGo/debug 74 C/C++ Problem

moc_Point.cpp

Code: Alles auswählen

int Point::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QObject::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    
#ifndef QT_NO_PROPERTIES
     if (_c == QMetaObject::ReadProperty) {
        void *_v = _a[0];
        switch (_id) {
        case 0: *reinterpret_cast< int*>(_v) = getColor(); break; /****** FEHLER 1 ********/
        }
        _id -= 1;
    } else if (_c == QMetaObject::WriteProperty) {
        void *_v = _a[0];
        switch (_id) {
        case 0: setColor(*reinterpret_cast< int*>(_v)); break;    /******* FEHLER 2 ********/
        }
        _id -= 1;
    } else if (_c == QMetaObject::ResetProperty) {
        _id -= 1;
    } else if (_c == QMetaObject::QueryPropertyDesignable) {
        _id -= 1;
    } else if (_c == QMetaObject::QueryPropertyScriptable) {
        _id -= 1;
    } else if (_c == QMetaObject::QueryPropertyStored) {
        _id -= 1;
    } else if (_c == QMetaObject::QueryPropertyEditable) {
        _id -= 1;
    } else if (_c == QMetaObject::QueryPropertyUser) {
        _id -= 1;
    }
#endif // QT_NO_PROPERTIES
    return _id;
}
QT_END_MOC_NAMESPACE
Ich nutze Eclipse Ganymed mit QT 4.4.3 auf einem 64Bit Suse 11.0 Linux System.
Vielen Dank im Vorraus
klopfer

Verfasst: 17. Dezember 2008 21:03
von solarix

Code: Alles auswählen

/*int Point::getColor()  {
   return color;
}
void Point::setColor(int c) {
   color = c;
}*/ 
Wenn du die Definition auskommentierst -oh wunder- gibt es sie nicht mehr... und kann -welch Überraschung- nicht mehr gefunden werden!!

Verfasst: 17. Dezember 2008 21:25
von klopfer667
solarix hat geschrieben:

Code: Alles auswählen

/*int Point::getColor()  {
   return color;
}
void Point::setColor(int c) {
   color = c;
}*/ 
Wenn du die Definition auskommentierst -oh wunder- gibt es sie nicht mehr... und kann -welch Überraschung- nicht mehr gefunden werden!!
*hüstel* ist das nicht Sinn von QT_PROPERTIES - du weiß doch was das ist - eben nur die Deklaration und eben keine Definition für private Variablen bzw der set und get Menber zu brauchen?

"oh wunder" steht doch hier oder? http://doc.trolltech.com/4.3-snapshot/properties.html
:roll: Ich hoff ich konnte dir helfen ... :roll:

Verfasst: 17. Dezember 2008 21:43
von klopfer667
Ok du hast irgendwie Recht...ich verstehe allerdings den Sinn von QT_PROPERTY dann nicht. Welchen Sinn hat dieses Makro, wenn wenn ich set und get doch implementieren muß?!
Diesmal mit der Bitte um Aufklärung :)
klopfer

Verfasst: 17. Dezember 2008 22:07
von solarix
Eigentlich steht ja alles in dem von dir geposteten Link... wie z.B:
However, since you can get a list of all available properties for any QObject through its QMetaObject, QObject::setProperty() can give you control over classes that weren't available at compile time.
Wobei ich zugeben muss, dass mir (offenbar genau wie dir) nicht sehr viele Anwendungen in den Sinn kommen. Ich habe Properties bisher nur in einem Zusammenhang verwendet: Properties in Designer-Plugins erscheinen im Property-Editor und werden in die UI-File gespeichert... elegane Sache, aber sonst hatte ich noch keine andere Anwendung....