Hallo, ich habe ein Problem mit Qt, zu dem ich nichts in der Dokumentation und im Netz gefunden habe. Ich möchte das Signal eines QSliders aufbereiten und an ein Gerät an am USB-Ausgang schicken. Der Wert des Sliders wird ansonsten nicht mehr verwendet. In allen Beschreibungen, die ich gefunden habe, werden nur Fälle beschrieben, die eine Veränderung innerhalb von Qt bewirken. Damit ist auch klar, von was ich meine Klasse, in der der Slot definiert wird, ableiten muss. Aber von muss ich erben, wenn es um eine völlig eigenständige Funktion geht, die nichts mehr mit Qt zu tun hat? Habe ich etwas übersehen, oder hatte schon mal jemand ein ähnliches Problem zu lösen und kann mich in die richtige Richtung stoßen? Über jeden "Wink mit dem Zaunpfahl" wäre ich dankbar. Heiko Berberich -- Ohne Sicherheit ist keine Freiheit. Wilhelm von Humboldt (1767-1835) GnuPG-Schlüssel: http://www.berberich-is.de/keys/news.asc
Moin moin, Am Montag, 7. März 2005 08:22 schrieb Heiko Berberich:
Ich möchte das Signal eines QSliders aufbereiten und an ein Gerät an am USB-Ausgang schicken. Der Wert des Sliders wird ansonsten nicht mehr verwendet. In allen Beschreibungen, die ich gefunden habe, werden nur Fälle beschrieben, die eine Veränderung innerhalb von Qt bewirken.
Ja, das ist so:) QSlider stellt Dir ja AFAIK einen Wert zur Verfügung, diesen Wert willst Du an das Gerät senden??? So verstehe ich das jetzt... Ich benutze meist' den Designer und binde immer eine dateiname.ui.h mit ein. Dort werden auch meist die Slot's und Funktionen "ausprogrammiert". Was hindert Dich daran, einen eigenen Header einzubinden? Richtig, gar nichts :))
Damit ist auch klar, von was ich meine Klasse, in der der Slot definiert wird, ableiten muss. Aber von muss ich erben, wenn es um eine völlig eigenständige Funktion geht, die nichts mehr mit Qt zu tun hat?
Dann musst Du auch nicht erben, Du kannst doch eigene Klassen einbinden ....
Habe ich etwas übersehen, oder hatte schon mal jemand ein ähnliches Problem zu lösen und kann mich in die richtige Richtung stoßen? Über jeden "Wink mit dem Zaunpfahl" wäre ich dankbar.
Ich glaube, Du siehst das nur zu kompliziert ... BTW, benutzt Du den Desinger? Ciao andre
Hallo, du hast das Problem genau verstanden. Ich habe jetzt noch ein wenig gestöbert und bin darauf gestoßen, dass man die Klasse natürlich einbinden kann. Allerdings muss sie von QObject geerbt sein, um einen Slot darauf definieren zu können. Also habe ich das getan. und definiere diesen Slot in dmxInterface.h: public slots: void sendSingle(int ChannelValue); Nun versuche ich die Connection zu erstellen mit QObject::connect(mySlider,SIGNAL(sliderMoved(int)),Interface,SLOT(sendSingle(int))); und erhalte diese Fehlermeldung: dcu.cpp:133: error: no matching function for call to `QObject::connect(QSlider*&, const char[18], dmxInterface&, const char[17])' Leider kann ich damit gar nichts anfangen. Kannst du mir da weiterhelfen? Achja, ich versuche den Designer im Moment noch zu vermeiden um erstmal die dahinter stehenden Konzepte zu verstehen. Meines erachtens ist das sinnvoller.
Ich glaube, Du siehst das nur zu kompliziert ...
Das ist leider oft wirklich so. In diesem Sinne... Heiko Berberich -- Ohne Sicherheit ist keine Freiheit. Wilhelm von Humboldt (1767-1835) GnuPG-Schlüssel: http://www.berberich-is.de/keys/news.asc
Hi Heiko, Am Montag, 7. März 2005 10:46 schrieb Heiko Berberich:
du hast das Problem genau verstanden. Ich habe jetzt noch ein wenig gestöbert und bin darauf gestoßen, dass man die Klasse natürlich einbinden kann. Allerdings muss sie von QObject geerbt sein, um einen Slot darauf definieren zu können. Also habe ich das getan. und definiere diesen Slot in dmxInterface.h:
Ok, aber ist dmxInterface Dein MainWindow? Oder wird dmxInterface in Deinem MainWindow benutzt?
public slots: void sendSingle(int ChannelValue);
Nun versuche ich die Connection zu erstellen mit QObject::connect(mySlider,SIGNAL(sliderMoved(int)),Interface,SLOT ^^^^^^ Ist ansich immer "this", d.h. z,B. Dein MainWindow Objekt.
Hast Du den "connect" auch an der richtigen Stelle im Programm?
(sendSingle(int)));
und erhalte diese Fehlermeldung: dcu.cpp:133: error: no matching function for call to `QObject::connect(QSlider*&, const char[18], dmxInterface&, const char[17])'
Bei mir sieht's z.B. mit den connect so aus: Der Slot ist in einer QT-Header Datei(mein MainWindow), in der cpp-Datei steht: connect( tableKasse, SIGNAL( currentChanged(int,int) ), this, SLOT( fillKasse() ) ); tableKasse ist hier ein QTable und fillKasse ist der Slot. Alle Slot's, etc stehen bei z.B. in der "MainWindow" Datei, in diesen Slot's(fillKasse) rufe ich dann meine Funktionen auf...
Leider kann ich damit gar nichts anfangen. Kannst du mir da weiterhelfen?
Der Compiler findet QObect::connect nicht, oder Deine Parameter stimmen vom Typ/Anzahl her nicht...
Achja, ich versuche den Designer im Moment noch zu vermeiden um erstmal die dahinter stehenden Konzepte zu verstehen. Meines erachtens ist das sinnvoller.
ACK, merke Dir nur, das der Designer Dir den ganzen "Klein-Scheiss" abnimmt :)) Ciao andre
Hallo Andre, Vielen Dank für deine Bemühungen. Ich habe mich dazu entschlossen, meinen Code nochmal komplett neu zu erstellen. Dazu habe ich mir eine kleine Vorlage mit dem Designer erstellt. Du siehst, ich lerne dazu. *fg* Jetzt funktioniert die Funktion genau so, wie ich es mir vorgestellt habe. Ich bin begeistert. Es waren mehrere Fehler in meiner vorhergehenden Version. Zumindest habe ich das Prinzip von Qt jetzt wesentlich besser verstanden. Vielen Dank für deinen Beitrag dazu. Aber eine kleiner Frage habe ich noch, die jetzt nicht so wahnsinnig wichtig ist, die mich aber interessieren würde. Dadurch, dass der Aufruf von eigenen Signalen oder Slots in der (bei mir jetzt) MainWindow.ui.h steht, ist doch eigentlich die Idee der Trennung von GUI und Programm nicht mehr so ganz gegeben, oder sehe ich das falsch? Gibt es dazu elegantere Varianten? Viele Grüße Heiko Berberich -- Ohne Sicherheit ist keine Freiheit. Wilhelm von Humboldt (1767-1835) GnuPG-Schlüssel: http://www.berberich-is.de/keys/news.asc
Moin moin, Am Montag, 7. März 2005 18:47 schrieb Heiko Berberich:
Aber eine kleiner Frage habe ich noch, die jetzt nicht so wahnsinnig wichtig ist, die mich aber interessieren würde.
Dadurch, dass der Aufruf von eigenen Signalen oder Slots in der (bei mir jetzt) MainWindow.ui.h steht, ist doch eigentlich die Idee der Trennung von GUI und Programm nicht mehr so ganz gegeben, oder sehe ich das falsch? Gibt es dazu elegantere Varianten?
Hmm, ich habe bis jetzt zwei methoden benutzt: In meinen Anfängen habe ich lediglich mit dem Designer die UI Files erstellt. Den generierten Quellcode habe ich dann von Hand weiterverarbeitet und in meinen Projekten benutzt. Das hat aber Nachteile! Als Nachteil ist die Sache, das wenn man nicht aufpasst eigene Codestücke überschreibt, aber man ist dafür nicht so an die QT-Methode gebunden Jetzt benutze ich den Designer und die Möglichkeit der "*.ui.h", Die Trennung des GUI von der Logik mache ich, indem ich einfach eigene Klassen schreibe. Du kannst auch in dem ui.h File init() und destroy() Methoden benutzen um Konstruktoren/Destruktoren nachzubilden. Mit KDevelop oder auch der M$ Kram arbeitet mit Qt super zusammen, d.h. wenn Du z.B. ein UI File änderst erkennt das Make und ruft den UIC auf... Schaue Dir mal das UI-File genauer an, Du kannst so auch mit dem TextEditor Änderungen vornehmen. Z.B. andere Header etc einbinden. Das eröffnet Dir so manchen Vorteil, IMHO ist das schon einen gute Trennung von GUI und Logik. Ich habe natürlich genau wie Du angefangen und habe erstmal den Designer weggelassen, aber mittlerweile kann ich auf den Designer nicht mehr verzichten :) Ciao Andre
participants (2)
-
Andre Heine
-
Heiko Berberich