Workaround für "Signals of generic types not supported:

Alles zum Qt Framework für Java
Antworten
jaleo
Beiträge: 5
Registriert: 23. Juli 2009 14:44

Workaround für "Signals of generic types not supported:

Beitrag von jaleo »

Hallo Leute,

Hab ebn grad mal im Board gesucht und noch nichts passendes gefunden.
Mein Problem ist, ich brauch ein Generic Signal1 ->

Code: Alles auswählen

public class SignalTest<T> extends QWidget{
	public Signal1<T> nodeSignal;
	public T node;
	
	public SignalTest(T node){
		this.node = node;
	}
}
Nur bekomm ich hier die Fehlermeldung:
java.lang.RuntimeException: Signals of generic types not supported: T
at com.trolltech.qt.internal.QtJambiInternal.resolveSignal(QtJambiInternal.java:492)
at com.trolltech.qt.internal.MetaObjectTools.buildMetaData(MetaObjectTools.java:543)
at com.trolltech.qt.gui.QWidget.__qt_QWidget_QWidget_WindowFlags(Native Method)
at com.trolltech.qt.gui.QWidget.<init>(QWidget.java:77)
at com.trolltech.qt.gui.QWidget.<init>(QWidget.java:73)
at otherTest.SignalTest.<init>(SignalTest.java:9)
at otherTest.SubSignalTest.<init>(SubSignalTest.java:11)
at otherTest.SubSignalTest.main(SubSignalTest.java:30)
Selbst wenn ich von der Klasse erbe, und das Signal1<T> mit Signal1<NodeL> instanzier bekomm ich die Fehlermeldung.

Code: Alles auswählen


public class SubSignalTest extends SignalTest<NodeL> {
	
	public SubSignalTest(NodeL node) {
		super(node);
		
		this.nodeSignal = new Signal1<NodeL>();
		this.nodeSignal.connect(this, "clucked(NodeL)");
	}
	
	public void clucked(NodeL d){
		System.out.println(d.toString());
	}
	
	@Override
	protected void mousePressEvent(QMouseEvent arg) {
		this.nodeSignal.emit(this.node);
	}
	
	public static void main(String[] args) {
        QApplication.initialize(args);

        SubSignalTest testWidgetGraphicsView = new SubSignalTest(new NodeL());
        testWidgetGraphicsView.show();
        QApplication.exec();
  }
}
Wäre super wenn ihr einen tipp oder sogar ein workaround hättet :)

Vielen dank schon mal
Lg
jaleo
Beiträge: 5
Registriert: 23. Juli 2009 14:44

Beitrag von jaleo »

Gut, ich hab eine Lösung gefunden.. Ob es schön ist, ist eine andere frage..
Ich erb von einer abstrakten klasse, komischer weise geht es so, ein generisches Signal zu definieren.

Code: Alles auswählen

public abstract class AbstractContainsSignal<T extends AbstractSignal> extends QWidget{
	public T signal;
	
	public abstract T getSignal();
}
Dann einfach weiter vererben:

Code: Alles auswählen

public class SignalTest<T> extends AbstractContainsSignal<Signal1<T>>{
	public T node;
	
	public SignalTest(T node){
		this.node = node;
	}

	@Override
	public Signal1<T> getSignal() {
		return this.signal;
	}
}
nochmals weiter vererbn und das signal überschreiben:

Code: Alles auswählen

public class SubSignalTest extends SignalTest<NodeL> {
	Signal1<NodeL> signal;
	
	public SubSignalTest(NodeL node) {
		super(node);

		this.signal = new Signal1<NodeL>();
		this.signal.connect(this, "clucked(NodeL)");
	}
	
	public void clucked(NodeL d){
		System.out.println(d.toString());
	}
	
	@Override
	protected void mousePressEvent(QMouseEvent arg) {
		this.signal.emit(this.node);
	}
	
	public static void main(String[] args) {
        QApplication.initialize(args);

        SubSignalTest testWidgetGraphicsView = new SubSignalTest(new NodeL());
        testWidgetGraphicsView.show();
        QApplication.exec();
  }
}
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

vielleicht habe ich jetzt nicht schnell genug erfasst, was Du eigentlich vorhast, aber wenn es Dir um das Senden von Signalen mit Parametern der Klasse NodeL (oder abgeleiteten Objekten) geht, würde doch folgendes genügen:

Code: Alles auswählen

Signal1<NodeL> m_node_emitter = new Signal1<Nodel>();

...

m_node_emitter.connect(this,"OnBla("NodeL")"); 

...
m_node_emitter.emit(this.node);
...

protected void OnBla(NodeL node) {
    System.out. ...
}

oder willst Du die abgeleitete Signalklasse mit Zusatzeigenschaften versehen und auf verschiedene Typen anwenden ?

Gruß Arne
Antworten