PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ärger mit XLib und QT: Will nicht kompilieren



axeljaeger
06-04-2003, 16:01
Ich wollte da heut ein kleines Programm kompilieren, aber da kommen ganz abenteuerliche Fehlermeldungen:




#include <X11/X.h> // <-- Das ist schuld, ich weis, aber warum?
#include <qslider.h>
#include <qapplication.h>

int main(int argc, char ** argv)
{
QApplication app(argc, argv);
QSlider slider;
app->setMainWidget(&slider);
slider.show();
return app.exec();
}



und dann kommt da das hier raus:




[axel@axel axel]$ g++ -L/home/axel/qt-x11-free-3.1.2/lib -I/home/axel/qt-x11-free-3.1.2/include slider.cpp
slider.cpp:12:1: warning: no newline at end of file
+In file included from /home/axel/qt-x11-free-3.1.2/include/qwindowdefs.h:45,
from /home/axel/qt-x11-free-3.1.2/include/qwidget.h:42,
from /home/axel/qt-x11-free-3.1.2/include/qslider.h:42,
from slider.cpp:2:
/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:711: parse error before `0'
/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:730: missing ';' before right brace
/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:734: `arrowCursor' declared as reference but not
initialized
/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:735: `upArrowCursor' declared as reference but not
initialized
/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:736: `crossCursor' declared
as reference but not initialized/home/axel/qt-x11-free-
.1.2/include/qnamespace.h:737: `waitCursor' declared as reference but not



und so geht das dann noch mehrere Seiten weiter. Offenbar stört X.h Qt beim kompilieren. Kann man irgendwie verhindern?

anda_skoa
06-04-2003, 19:22
Bist du dir sicher, das er X.h auch findet?

Was ist, wenn du das include X.h nach den Qt includes schreibst?

Ciao,
_

axeljaeger
06-04-2003, 20:15
Original geschrieben von anda_skoa
Bist du dir sicher, das er X.h auch findet?


Ziemlich, sonst sähe ja die Fehlermeldung anders aus. Außerdem findet er die Header, mit anderen Programmen geht es


Original geschrieben von anda_skoa

Was ist, wenn du das include X.h nach den Qt includes schreibst?


Weis ich noch nicht. Ich kann das aber auch nicht anders machen, weil mein Programm in Wirklichkeit mit dem Qt-Designer entwickelt wird. Dem kan ich nich vorschreiben, in welcher Reihenfolge er die Header beim Erzeugen aus den .ui-Files inkludiert. Aber das ist doch ein interessantes Problem, zumal dieser Header ja von Qt auch irgendwo inkludiert werden muß.

axeljaeger
07-04-2003, 09:50
Ich hab den Fehler gefunden, aber das Problem noch nicht gelöst:

Also, gcc meckert:



/home/axel/qt-x11-free-3.1.2/include/qnamespace.h:711: parse error before `0'


Die entsprechende Zeile aus qnamespace.h sieht so aus:



enum CursorShape {


Wo kommt die 0 her? In X.h steht folgendes:



#define CursorShape 0


Das kann nicht gut gehen, aber wie kann man das lösen? Ich kriege noch mehr Ärger, weil z.B. folgendes auch nicht geht, wenn ich X.h inkludiere:


if(e->type() == QEvent::KeyRelease)

weil auch eine #define das KeyRelease durch eine 3 ersetzt. Das fängt an, lustig zu werden.

anda_skoa
07-04-2003, 11:34
Hmm, ich hatte noch nie in einem UIC generierten Header ein X include.

Wie kommt das da rein?

Ciao,
_

axeljaeger
07-04-2003, 13:03
Nun, ich hab ein CustomWidget, das X.h braucht. Folglich steht in meinem Widgetheader diese Datei drinn. Da ich meine UI mit Qt-Designer baue, wird der Qt-Designer meine embedwidget.h auch in seine Formimplementation einbauen. Außerdem tritt das zweite Problem, was ich angesprochen habe, auch auf, wenn ich X.h ans Ende meiner inkludierungen setze, weil halt KeyRelease ersetzt wird. Ich werde wohl nicht drumrum kommen, das X-Zeug irgendwie auszukoppeln.

anda_skoa
07-04-2003, 13:37
Dürfte kein Problem sein, das Custom Widget später einzu bauen.

Einfach an der Stelle einen Frame machen und den dann später als Parent verwenden.

Du könntest dir auch QXEmbed ansehen:
http://developer.kde.org/documentation/library/3.0-api/classref/kdeui/QXEmbed.html

Ciao,
_