Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt Jambi - Qt for Java
Senior Sanchez
2006-07-29, 17:20:02
Falls es jemand noch nicht kennt, gerade auf heise.de gesehen:
http://www.heise.de/newsticker/meldung/76127
Senior Sanchez
2006-07-29, 19:20:15
Ich muss zugeben, dass ich ja noch nie mit Qt gearbeitet habe, aber man hört ja viel Gutes.
Könnte jemand der Qt-Erfahrenen mal etwas darüber schreiben?
Danke.
Senior Sanchez
2006-07-29, 19:45:53
Gast[/POST]']gibts schon
Was gibts schon?
PH4Real
2006-07-29, 19:47:08
Senior Sanchez[/POST]']Ich muss zugeben, dass ich ja noch nie mit Qt gearbeitet habe, aber man hört ja viel Gutes.
Könnte jemand der Qt-Erfahrenen mal etwas darüber schreiben?
Danke.
Ich hatte zwar bisher noch nicht viel mit Qt zu tun, aber lese mir gerade das durch: Qt Jambi White Paper (http://www.trolltech.com/developer/downloads/qt/resolveuid/23a8f998b27c2640e5d343cbe6e119b0).
Klingt jedenfalls ganz interessant :).
Muss mal die Beispiele ausprobieren...
Senior Sanchez[/POST]']Was gibts schon?den thread
Senior Sanchez
2006-07-29, 20:14:09
@Gast
Wenn du aufgepasst hättest, würdest du feststellen, dass dies der erste Thread zu dem Thema war und im anderen Thread dazu noch auf diesen hier verwiesen wurde.
Warum soll ich also im anderen Thread posten?
HellHorse
2006-07-29, 23:12:04
Hat das jemand zum laufen gebracht? Ich bekomme nur:
failed to load library: 'com_trolltech_qt_gui'
Exception in thread "main" java.lang.UnsatisfiedLinkError: libcom_trolltech_qt_gui.so.1.0.0: libcom_trolltech_qt_gui.so.1.0.0: undefined symbol: _ZTI17QAccessibleObject
Qt Version: 4.1.4
JavaDoc wäre auch nicht schlecht (nein, die C++ Doku tut's nicht).
update:
MV nur für C++?
Senior Sanchez
2006-07-29, 23:28:54
Es geht um die preview und nicht die eclipse-integration, richtig?
Ich schaue mal.
HellHorse
2006-07-29, 23:36:03
Senior Sanchez[/POST]']Es geht um die preview und nicht die eclipse-integration, richtig?
Yepp
Senior Sanchez
2006-07-29, 23:50:26
Also die exe ausführen geht.
Importiert in IDEA habe ichs auch bekommen.
Haste mal nen beispielsource zum testen, hellhorse?
Senior Sanchez
2006-07-30, 00:14:56
Ich habs jetzt hinbekommen.
Haste die Umgebungsvariable noch auf den bin-pfad von qtjambia gesetzt?
PH4Real
2006-07-30, 01:55:05
Yep.. dann gehts... unter Windows:
Zunächst:
set PATH=%PATH%;C:\BIN_VERZEICHNIS_VON_JAMBI
und dann z.b.:
java -cp .;qtjambi.jar com.trolltech.demos.Deform
Ist auf jeden Fall schonmal sehr fix :)
Senior Sanchez
2006-07-30, 11:40:50
PH4Real[/POST]']Yep.. dann gehts... unter Windows:
Zunächst:
set PATH=%PATH%;C:\BIN_VERZEICHNIS_VON_JAMBI
und dann z.b.:
java -cp .;qtjambi.jar com.trolltech.demos.Deform
Ist auf jeden Fall schonmal sehr fix :)
Steht natürlich inner Readme, aber wer schaut da schon rein? *g*
Was sich mir aber jetzt fürne Frage stellt: Angenommen ich schreibe ne Applikation damit, muss dann jeder Nutzer der dieses Programm starten will, auch irgendwo dieses Bin-Pfad von Jambia haben mit allem Krams der da drin ist?
Das wäre ja, gelinde gesagt, ziemlich sch***e.
HellHorse
2006-07-30, 11:51:18
Senior Sanchez[/POST]']
Haste mal nen beispielsource zum testen, hellhorse?
Naja, alle Beispiele von Trolltech halt, z.B.
com.trolltech.examples.AnalogClock
Senior Sanchez[/POST]']
Haste die Umgebungsvariable noch auf den bin-pfad von qtjambia gesetzt?
Nö, wieso sollte ich? Hab's in the java.library.path getan wo's hingehört. Das soll gefälligst das im System installierte Qt nehmen.
In der Zwischenzeit war mir langweilig:
Signal und Solt für Swing (nicht gerade der Gipfel der Eleganz aber funktioniert)
public class BastardDemo {
protected static JFrame createFrame() {
JFrame frame = new JFrame("Bastard Demo");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JSlider slider = new JSlider(0, 100);
JComponent contentPane = (JComponent) frame.getContentPane();
contentPane.setBorder(createEmptyBorder(12, 12, 11, 11));
contentPane.add(slider);
slider.addChangeListener(new BastardListener("getValue", System.out, "println"));
frame.pack();
frame.setVisible(true);
return frame;
}
public static void main(String[] args) {
invokeLater(new Runnable() {
public void run() {
createFrame();
}
});
}
}
public class BastardListener implements ChangeListener, ActionListener {
private Method sourceAccessor;
private Method targetAccessor;
private Object explicitSource;
private Object target;
private String sourceAccessorName;
private String targetAccessorName;
public BastardListener(Object source, String sourceAccessorName, Object target, String targetAccessorName) {
this.explicitSource = source;
this.target = target;
this.sourceAccessorName = sourceAccessorName;
this.targetAccessorName = targetAccessorName;
this.initializeSourceAccessor(source);
}
private void initializeSourceAccessor(Object source) {
if (source != null && this.sourceAccessor == null) {
this.sourceAccessor = this.getMethodNamed(this.sourceAccessorName, source);
}
}
private void initializeTargetAccessor(Object value) {
if (this.targetAccessor == null) {
this.targetAccessor = this.getMethodNamed(this.targetAccessorName, this.target, value.getClass());
}
}
private Method getMethodNamed(String name, Object object) {
return this.getMethodNamed(name, object, null);
}
private Method getMethodNamed(String name, Object object, Class<?> argumentType) {
for (Method each : object.getClass().getMethods()) {
if (each.getName().equals(name) && (argumentType == null || this.hasCompatibleArguments(each, argumentType))) {
return each;
}
}
throw new BastardException("no method named: " + name + " found for: " + object);
}
private boolean hasCompatibleArguments(Method method, Class<?> argumentType) {
return method.getParameterTypes().length == 1
&& method.getParameterTypes()[0].isAssignableFrom(argumentType);
}
public BastardListener(String sourceAccessorName, Object target, String targetAccessorName) {
this(null, sourceAccessorName, target, targetAccessorName);
}
public void actionPerformed(ActionEvent event) {
this.handleEvent(event);
}
public void stateChanged(ChangeEvent event) {
this.handleEvent(event);
}
private void handleEvent(EventObject event) {
Object source = this.explicitSource != null ? this.explicitSource : event.getSource();
this.initializeSourceAccessor(source);
try {
Object value = this.sourceAccessor.invoke(source);
this.initializeTargetAccessor(value);
try {
this.targetAccessor.invoke(this.target, value);
} catch (IllegalArgumentException iae) {
throw new BastardException("setting target value failed", iae);
} catch (IllegalAccessException iae) {
throw new BastardException("setting target value failed", iae);
} catch (InvocationTargetException ate) {
throw new BastardException("setting target value failed", ate);
}
} catch (IllegalArgumentException iae) {
throw new BastardException("reading source value failed", iae);
} catch (IllegalAccessException iae) {
throw new BastardException("reading source value failed", iae);
} catch (InvocationTargetException ate) {
throw new BastardException("reading source value failed", ate);
}
}
}
update:
Senior Sanchez[/POST]']Steht natürlich inner Readme, aber wer schaut da schon rein? *g*
Ja, jetzt gayts :redface:
PH4Real
2006-07-30, 12:06:03
Senior Sanchez[/POST]']Steht natürlich inner Readme, aber wer schaut da schon rein? *g*
Was sich mir aber jetzt fürne Frage stellt: Angenommen ich schreibe ne Applikation damit, muss dann jeder Nutzer der dieses Programm starten will, auch irgendwo dieses Bin-Pfad von Jambia haben mit allem Krams der da drin ist?
Das wäre ja, gelinde gesagt, ziemlich sch***e.
Ich denk mal nicht alle... aber ein paar libs aus dem Verzeichnis wird es schon brauchen, da die .jar Datei ja nur ein Wrapper für die C++ Bibliotheken darstellt. Ist ja bei SWT ähnlich... dort braucht man ja auch eine dll. Die Dlls muss man dann mitliefern. Wobei die Qt libs wohl etwas größer sind als die SWT dll.
Zu Qt ansich:
Habe mal ein bißchen mit rumgespielt und finde es bisher ganz schick. Signal-Slot System find ich ganz gut ist aber irgendwie nicht sehr "typ-sicher" in Java umgebaut (siehe grobes Beispiel von HellHorse, welches aber sehr cool ist :biggrin: ). Listener nach Namenskonvention finde ich auch irgendwie komisch. Genau wie Methodenname in Strings zu schreiben, die dann aufgerufen werden. Die UI Trennung hingegen in eine xml Datei finde ich ganz gut.
Was ich mich jedoch wirklich frage... wer braucht Qt für Java? Das man damit in C++ eine platformübergreifende GUI bauen kann ist ja schön, aber das kann Java ja schon etwas länger. Ich meine, Konkurrenz ist ja nicht schlecht, aber grundsätzlich gibt es schon platformübgreifende GUIs für Java... eben hauptsächlich SWING und SWT. Den ganzen anderen Kram, den Qt noch bietet (XML, Datenbankkram etc.) braucht man bei Java nicht wirklich, da es ja genügend (Standard-) Bibliotheken dafür gibt.
Naja.. mal gucken wie sich SWING in Java 6 entwickelt (soll ja alles viel schneller und native gehen ;) ).
EDIT: Readme lesen ist cool :biggrin: ... wobei das mit dem Pfad wirklich verwirrend ist.
Abnaxos
2006-07-30, 13:01:34
PH4Real[/POST]']Was ich mich jedoch wirklich frage... wer braucht Qt für Java?
Mich interessiert es vor allem wegen der zu erwartenden Java-Bindings für KDE. Es gibt da zwar schon etwas, aber das ist irgendwas halbfertiges (u.A. wegen der unbefriedigenden Qt-Bindings). Aus mehreren KDE-Blogs war zu entnehmen, dass einige Entwickler in den Startlöchern sind, sich nochmal darum zu kümmern, wenn TrollTech seine Java-Bindings fertig hat.
Sehr edel fände ich natürlich auch, wenn man ein Swing-LnF bauen würde, das Qt bzw. KDE (idealerweise umschaltbar) als Back-End verwendet, ähnlich wie das OSX-LnF ...
HellHorse
2006-07-31, 15:59:36
Was ich mich jedoch wirklich frage... wer braucht Qt für Java?
Aufgrund des FAQ (http://www.trolltech.com/developer/knowledgebase/faq.2006-07-21.2284851474/) weil bisherige Qt Kunden (= Firmen die Lizenzen kaufen) lieber Java als C++ verwenden würden.
Daneben:
Firmen die C++ Applikationen schrittweise auf Java portieren wollen (hängt wohl damit zusammen).
KDE, schon erwähnt
"alle-java-guis-sind-scheisse"
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.