Seltsames 'Feature' im UI-Compiler (Linux)
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Seltsames 'Feature' im UI-Compiler (Linux)
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
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
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Hallo,
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)
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.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.
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)
Wie muss man sich "... was natürlich absolut in die Hose ging" als nachvollziehbare Compiler/Linker/Anwendungs-Fehlermeldung vorstellen?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
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Re: Seltsames 'Feature' im UI-Compiler (Linux)
Hallo,
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)
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.grog hat geschrieben: [...]
Wie muss man sich "... was natürlich absolut in die Hose ging" als nachvollziehbare Compiler/Linker/Anwendungs-Fehlermeldung vorstellen?
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)
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Hallo,
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)
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.upsala hat geschrieben:Ich wiederhole mit ja nur ungern:
Und warum? Die Sourcen vom uic sprechen dagegen.Außerdem bezweifle ich daß Top-, Left-, Right- und BottomMargin vom uic erkannt werden.
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)
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
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.upsala hat geschrieben:topMargin != TopMargin
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
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
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)upsala hat geschrieben:Niemand hier kann sich hier diesen 'Fehler' erklären. Warum sollte man auch? Es gibt ja nicht mal ein reproduzierbares Beispiel...
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)
-
Tilman Räger
- Beiträge: 189
- Registriert: 6. Juni 2007 15:23
- Wohnort: Göttingen
Nein, uic debuggen muß nun wirklich nicht sein. AberAuE hat geschrieben:Ich kann mir nicht vorstellen das moc oder sonst wer so etwas tun!
Hast du das schonmal gedebugt???
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.