Seite 1 von 1

Seltsames 'Feature' im UI-Compiler (Linux)

Verfasst: 13. November 2009 15:24
von Tilman Räger
Hallo,

Um ein spezielles Label zu realisieren, wurde bei uns eine Klasse von QWidget abgeleitet und dieser für die Ränder 4 Properties:
- TopMargin
- BottomMargin
- LeftMargin
- RightMargin
verpasst. Lt. Dokumentation überschreiben diese Properties keine Properties von QWidget, sollten also keine Konflikte ergeben. Für alle Properties gibt es die entsprechenden get- und set-Funktionen. Die Klasse wurde als Designer-Plugin erstellt.

Tests dieser Klassen im Qt-Designer verliefen erfolgreich. Eine Änderung der Properties im Designer ergab den erwünschten Effekt, soweit - so gut.

Die Verwendung unter Windows erfolgte auch ohne Probleme.

Dann, der grosse Knall: Unter Linux hatten die Einstellungen auf einmal keinen Effekt mehr. Nach langem Suchen stellte sich heraus, das der UI-Compiler diese Properties auf einmal zusammenfasste und mit der QWidget-Funktion 'setContentsMargins(int, int, int, int) bediente, was natürlich absolut in die Hose ging.

Kann mir jemand sagen, was dieser Blödsinn soll? schließlich ist TopMargin etc. kein reserviertes Schlüsselwort, es taucht bei der Klasse QWidget auch überhaupt nicht auf.
So ein Verhalten macht es absolut schwer, den Einsatz von Qt zu verteidigen!

Gruß
Tilman Räger

Verfasst: 13. November 2009 16:51
von upsala
Vielleicht hat Qt hat dieser Stelle einen Bug? Wenn du Bug-freie Software verwenden willst, nimm Microsoft-Produkte.

Außerdem bezweifle ich daß Top-, Left-, Right- und BottomMargin vom uic erkannt werden.

Verfasst: 13. November 2009 20:06
von Tilman Räger
Hallo,
upsala hat geschrieben:Vielleicht hat Qt hat dieser Stelle einen Bug? Wenn du Bug-freie Software verwenden willst, nimm Microsoft-Produkte.

Außerdem bezweifle ich daß Top-, Left-, Right- und BottomMargin vom uic erkannt werden.
Also, ein Bug ist das ganz sicher! Wie kommt der UIC dazu, die set-Funktionen für nicht aus der Basisklasse stammende Properties einfach zusammen zu fassen. Und das er das macht, ist eindeutig. Die Werte, die für die Properties im Designer angegeben wurden, tauchten hinterher als Parameter der Funktion 'setContentsMargins()' auf. Allerdings nur unter Windows.

Ob allerdings MS-Produkte unbedingt fehlerfreier sind - hab ich so meine Zweifel. Ganz abgesehen davon, daß die endgültige Zielplattform Linux ist.

Gruß
Tilman (Räger)

Re: Seltsames 'Feature' im UI-Compiler (Linux)

Verfasst: 15. November 2009 22:23
von grog
Tilman Räger hat geschrieben:Hallo,

Um ein spezielles Label zu realisieren, wurde bei uns eine Klasse von QWidget abgeleitet und dieser für die Ränder 4 Properties:
- TopMargin
- BottomMargin
- LeftMargin
- RightMargin
verpasst. Lt. Dokumentation überschreiben diese Properties keine Properties von QWidget, sollten also keine Konflikte ergeben. Für alle Properties gibt es die entsprechenden get- und set-Funktionen. Die Klasse wurde als Designer-Plugin erstellt.

Tests dieser Klassen im Qt-Designer verliefen erfolgreich. Eine Änderung der Properties im Designer ergab den erwünschten Effekt, soweit - so gut.

Die Verwendung unter Windows erfolgte auch ohne Probleme.

Dann, der grosse Knall: Unter Linux hatten die Einstellungen auf einmal keinen Effekt mehr. Nach langem Suchen stellte sich heraus, das der UI-Compiler diese Properties auf einmal zusammenfasste und mit der QWidget-Funktion 'setContentsMargins(int, int, int, int) bediente, was natürlich absolut in die Hose ging.

Kann mir jemand sagen, was dieser Blödsinn soll? schließlich ist TopMargin etc. kein reserviertes Schlüsselwort, es taucht bei der Klasse QWidget auch überhaupt nicht auf.
So ein Verhalten macht es absolut schwer, den Einsatz von Qt zu verteidigen!

Gruß
Tilman Räger
Wie muss man sich "... was natürlich absolut in die Hose ging" als nachvollziehbare Compiler/Linker/Anwendungs-Fehlermeldung vorstellen?

Re: Seltsames 'Feature' im UI-Compiler (Linux)

Verfasst: 16. November 2009 10:06
von Tilman Räger
Hallo,

grog hat geschrieben: [...]

Wie muss man sich "... was natürlich absolut in die Hose ging" als nachvollziehbare Compiler/Linker/Anwendungs-Fehlermeldung vorstellen?
Nun, die genannte Funktion 'setContentsMargins' stellt zwar auch irgendwie Ränder ein - irgendeinen Zusammenhang muß es ja schon haben, damit uic diese Umsetzung vornimmt - aber natürlich auf einem ganz anderen Weg als unsere Klasse. Die wiederum bekommt durch den Weg über die QWidget-Funktion natürlich nichts mehr mit und verwendet die Default-Einstellungen - und aus war's! Der gewünschte Effekt ist beim Teufel.

Was mich einfach interessiert ist, wie kommt uic dazu, Properties einer abgeleiteten Klasse - die nicht gleichnamige Properties mehr oder weniger illegalerweise überschreiben - einfach durch eine Funktion der Basisklasse zu ersetzen. Eine solche 'Optimierung' ist schlicht ein katastrophaler Bug und Wasser auf die Mühlen von denen, die eh am liebsten wieder zu MS zurückwollen.


Gruß
Tilman (Räger)

Verfasst: 16. November 2009 12:19
von upsala
Ich wiederhole mit ja nur ungern:
Außerdem bezweifle ich daß Top-, Left-, Right- und BottomMargin vom uic erkannt werden.
Und warum? Die Sourcen vom uic sprechen dagegen.

Verfasst: 16. November 2009 12:44
von Tilman Räger
Hallo,
upsala hat geschrieben:Ich wiederhole mit ja nur ungern:
Außerdem bezweifle ich daß Top-, Left-, Right- und BottomMargin vom uic erkannt werden.
Und warum? Die Sourcen vom uic sprechen dagegen.
Ich konnte es auch kaum glauben - aber das Resultat sprach ganz eindeutig für sich - im ui-File standen die 4 Properties (topMargin, etc.) im daraus erzeugten Header ui_x.h stand nur noch die Funktion setContentsMargins() mit den 4 Parametern entsprechend dem ui-File. Änderungen der Properties im Designer führten zur entsprechenden Änderung der Parameter der Funktion - also wirklich eindeutig.
Vielleicht sollte man noch anmerken, wir arbeiten mit Qt 4.3.3.

Übrigens - ein Blick in die Quellen des UIC belehrt eines besseren! In der Datei src\tool\uic\cpp\cppwriteinitialization.cpp fragt explizit nach 'topMargin', 'bottomMargin' etc ab und fügt dann die genannte Funktion 'setContentsMargins()' in den erzeugten Header ein - nur, für welche Klassen das jetzt tatsächlich passieren soll und bei uns vielleicht irrtümlicherweise tut - dafür hatte ich nicht die Zeit - das ist Sache von Trolltech.
Gruß
Tilman (Räger)

Verfasst: 16. November 2009 16:50
von upsala
topMargin != TopMargin

Verfasst: 17. November 2009 09:42
von Tilman Räger
upsala hat geschrieben:topMargin != TopMargin
Zugegeben, bei C++ spielt Groß-/Kleinschreibung eine Rolle. Aber wenn man damit anfängt, dass die Groß- oder Kleinschreibung des 1. Buchstaben denn Sinn einer Property beeinträchtigt, dann gut Nacht.

M.E. müssten solche quasi "Reservierte Bezeichner" in der Dokumentation ausdrücklich erwähnt werden - oder es darf keine solche Ersetzung geben. Alles andere ist ein schwerwiegender Fehler - man kann sich ja nicht mehr darauf verlassen, daß seine eigenen, völlig legalen und korrekt implementierten Properties nicht vom uic zerschossen werden. Fast schon ein KO-Kriterium

Verfasst: 17. November 2009 09:57
von AuE
Die QtNamensgebung ist doch eindeutig. Kleinbuchstabe fürs erstes Wort bei Funktionen.

Ich kann mir nur diesen Effekt überhaupt nicht erklären. Was sagen denn die Trolls?

Verfasst: 17. November 2009 12:24
von upsala
Niemand hier kann sich hier diesen 'Fehler' erklären. Warum sollte man auch? Es gibt ja nicht mal ein reproduzierbares Beispiel...

Verfasst: 17. November 2009 12:36
von Tilman Räger
upsala hat geschrieben:Niemand hier kann sich hier diesen 'Fehler' erklären. Warum sollte man auch? Es gibt ja nicht mal ein reproduzierbares Beispiel...
Ich darf den Code leider hier nicht posten - ist kein OpenSource-Projekt. Und groß Lust, jetzt ein entsprechendes Beispiel zu produzieren habe ich eigentlich auch nicht (nach täglich 8 Stunden am Rechner, keinem vernünftigen Arbeitsplatz zu Hause und noch dazu Problemen mit den Augen)

Aber ich kann versichern, das es sich tatsächlich so verhält, wie ich es beschrieben habe. Die entsprechenden Stellen im uic-Code habe ich angegeben und - vielleicht unklugerweise - ist die Regelung für Groß- und Kleinschreibung bei uns identisch, d. h. die Property heitßt z.B. topMargin, die dazugehörige set-Routine dann setTopMargin().
Was mich nervt, ist das uic einfach die 4 set-Routinen zu einer zusammenfasst die mit der ganzen Sache nichts zu tun hat und das auch nicht dokumentiert wird. Die Properties einer Klasse haben für den uic tabu zu sein, d.h. eins zu eins übernommen zu werden ohne Optimierung - so wie der uic das unter Windows ja auch macht.

Tilman (Räger)

Verfasst: 17. November 2009 12:38
von AuE
Ich kann mir nicht vorstellen das moc oder sonst wer so etwas tun!

Hast du das schonmal gedebugt???

Verfasst: 17. November 2009 13:59
von Tilman Räger
AuE hat geschrieben:Ich kann mir nicht vorstellen das moc oder sonst wer so etwas tun!

Hast du das schonmal gedebugt???
Nein, uic debuggen muß nun wirklich nicht sein. Aber
1. ist die Zuordnung eindeutig (Setzen der Properties im Designer -> ui-File -> ui- Header (via uic). im ui-File stehen noch die Properties drin, im Header dann unter Windows die set-Funktionen der Properties unter Linux 'optimiert' die Fkt. setContentsMargins() die alle 3 Properties (falsch) zusammenfaßt.
2. in der oben genannten uic-Quelldatei steht es nun mal eindeutig so drin (wenn auch mit diversen if's etc. verklausuliert, so daß ich eigentlich dazu neige, das ganze als fehler anzusehen (warum sollte es sonst unter Windows anders funktionieren) - aber die Mühe habe ich mir noch nicht gemacht - warum auch? Das es so arbeitet ist eindeutig.

Verfasst: 17. November 2009 14:32
von AuE
Muss mich berichtigen:
Ich kann mir das nicht vorstellen oder es ist ein derber Bug.

Ich kann es aber leider nicht nachvolziehen und daher fällts mir auch schwer.

Wenn du Kommerz Version hast support. Sonst direkt Task Tracker!