kostenloser Webspace werbefrei: lima-city


Qt: Parameter an SLOT übergeben

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Hallo. :)
    Ich habe schon lange nach einer Lösung gesucht. Google hat mir nicht wirklich geholfen, ich hatte zwar mehrere Themen die exakt das selbe beschreiben, jedoch konnten unsere Englischen Freunde nie wirklich eine verständliche/sinnvolle Lösung vorbringen.
    Bei meinen anderen Projekten, war es egal, aber jetzt brauch ich ressourcen.
    :)

    Ich habe ungefähr ~60 QLineEdits.
    Eine Groupbox enthält 30.

    Wenn eine Variable in einem der Felder geändert wird, soll das array an der jeweiligen Position mit dem Wert gefüllt werden. Das ist kein Problem.
    Ich müsste jetzt allerdings eigentlich über:

    connect(lineEdit_0, SIGNAL(textChanged(QString)), this, SLOT(varChanged_1()));


    Für jedes QObject der Kasse QLineEdit einen eigenen Slot schreiben. Aber nochmal ca. 30 bzw. ingesammt dann 60 Funktionen zu schreiben wäre echt blöd.
    Was ich mir vorstelle ist so ein Ding:

    connect(lineEdit_0, SIGNAL(textChanged(QString)), this, SLOT(varChanged(0)));


    Soll heißen. Der Funktion bzw. dem SLOT varChanged wird eine Zahl übergeben und der benutzt diese dann um zu erkennen mit welcher QLineEdit er dann arbeiten soll.


    Bei dem was ich gefunden habe, wird gesagt, das Problem ist, das das SIGNAL textChanged keinen int Wert übergeben kann, d.h. der parameter auch über das Signal übergeben werden muss. Ich müsste laut ihnen also textChanged umschreiben. Nur habe ich derzeit echt keinen Ansatz.

    Hat jemand einen - theoretischen - Ansatz wie das umzusetzen ist? Bzw. eine andere Idee?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Salü!

    Naja ich habe dein Problem nicht 100% gecheckt und bin mit dem Singal-Slot verfahren oft selbst noch verwirrt.

    Eine andere Lösung wäre, dass du eine eigene Klasse mit dem passenden Signal (oder eben Slot) schreibst.
    Genauere Details dazu habe ich gerade nicht, war nur neh Idee. :-)

    Ich habs mir nocheinmal angeschaut. Wird das Signal dann immer nur von lineEdit_0 gesendet, oder auch von lineEdit_1, usw?
    Ich weiss jetzt zwar nicht ob du einen konstanten Wert als Parameter übergeben kannst, jedoch würde mir spontan einfall:
    connect(lineEdit_0, SIGNAL(textChanged(QString)), this, SLOT(varChanged(0)));
    connect(lineEdit_1, SIGNAL(textChanged(QString)), this, SLOT(varChanged(1)));
    connect(lineEdit_2, SIGNAL(textChanged(QString)), this, SLOT(varChanged(2)));
    ...
    connect(lineEdit_n, SIGNAL(textChanged(QString)), this, SLOT(varChanged(n)));

    Wird zwar dann kein schöner Code, aber würde funktionieren.
    Nun kannst du eifach im Slot unterscheiden von wo dass es kommt.

    Weiss nicht obs klappt! =)

    mfg KlasseT
  4. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Genau das was du schreibst, soll letztendlich passieren. Das Problem ist aber, wie ich bereits geschrieben habe, das man einem SLOT keinen Parameter übergeben kann, wenn das SIGNAL z.B. textChanged ist.
    Das ist eine eigene Klasse schreiben muss, darum werde ich nicht herumkommen, aber genau nach Ideenanstößen dafür habe ich ja gefragt. :)
  5. robbmaster schrieb: Genau das was du schreibst, soll letztendlich passieren. Das Problem ist aber, wie ich bereits geschrieben habe, das man einem SLOT keinen Parameter übergeben kann, wenn das SIGNAL z.B. textChanged ist.
    Das ist eine eigene Klasse schreiben muss, darum werde ich nicht herumkommen, aber genau nach Ideenanstößen dafür habe ich ja gefragt. :)


    Okay ich glaube nun hab ichs verstanden.

    Also die parameter Listen müssen gleich sein, bzw. auf der linken Seite mehr als auf der rechten Seite (wenn ich das jetzt richtig verstanden habe, müsste es aus probiere hab aber grad keine Lust)
    Wie wäre es wenn du nun das SIGNAL vom lineEdit_X mit einem SLOT von lineEdit_X verbindest und über diesen SLOT dann ein weiteres SIGNAL aussendest, welches dann vom "this" SLOT abgefangen werden kann. Somit könntest du die parameter selbst bestimmen und wenn gewollt sogar das ganze lineEdit_X-Objekt als pointer übergeben... =)
    Somit müsstes du "nur" die LineEdit-Klasse erweitern.

    Ansonstens google mal noch, ob es möglich ist anhand eines SIGNALs auf das Aussende Objekt rückschlüsse zu ziehen...

    mfg KlasseT
  6. Du musst nur einen einzigen SLOT schreiben! Diesen Slot verbindest du mit allen TextChanged-Signals deiner LineEdit-Objekte.

    Innerhalb der Slot-Methode musst du dann abfragen, wer der "Sender" dieses Signals war. Also bei welchem der LineEdit-Objekte nun der Text geändert wurde. Dies kannst du einfach durch Aufruf der Methode Sender() innerhalb der Slot-Methode.
    Dürfte ungefähr so lauten der Code, wenn ich mich nicht irre:
    QLineEdit *senderLineEdit = qobject_cast <QLineEdit*>(sender());

    Die Methode sender() liefert dir einen Zeiger auf ein QObject. Da du aber weißt, dass hier nur QLineEdit-Objekte mit diesem SLOT verbunden haben, kannst du es auf ein QLineEdit casten, damit du alle Methoden davon benutzen kannst (falls du die überhaupt brauchst^^).



    Ein weiterer Tipp: Bitte nicht soviele eigenständige Variablen für die LineEdit-Objekte anlegen. Kannst du doch auch mit einem Array machen, das erspart dir eine Menge Tipparbeit, dann kannst du vieles einfach in Schleifen automatisiert durchführen.

    Ein weiterer Tipp: Wenn du schon soviele LineEdits anlegen musst, dann würde ich überlegen ein anderes Steuerelement dafür zu benutzen. Es gibt QTableWidget und QTableView, welche man ganz hervorragend für solche Sachen benutzen kann. Da musst du dich unbedingt noch etwas einlesen. Dies kostet Zeit und Mühe, spart dir aber für weitere Programme eine Menge Arbeit, weil du nicht den ganzen Kram so umständlich mit 1000 LineEdits durchführen musst... :-)))

    Beitrag zuletzt geändert: 20.5.2010 20:20:03 von tangoal
  7. tangoal schrieb:
    Innerhalb der Slot-Methode musst du dann abfragen, wer der "Sender" dieses Signals war. Also bei welchem der LineEdit-Objekte nun der Text geändert wurde. Dies kannst du einfach durch Aufruf der Methode Sender() innerhalb der Slot-Methode.


    Dacht ich doch, dess es so was gibt! :-)
    Ja das erleichtert einiges, aber bin nicht wirklich so ein Qt Experte... ;-)

    mfg
  8. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    tangoal schrieb:
    Du musst nur einen einzigen SLOT schreiben! Diesen Slot verbindest du mit allen TextChanged-Signals deiner LineEdit-Objekte.

    Innerhalb der Slot-Methode musst du dann abfragen, wer der "Sender" dieses Signals war. Also bei welchem der LineEdit-Objekte nun der Text geändert wurde. Dies kannst du einfach durch Aufruf der Methode Sender() innerhalb der Slot-Methode.
    Dürfte ungefähr so lauten der Code, wenn ich mich nicht irre:
    QLineEdit *senderLineEdit = qobject_cast <QLineEdit*>(sender());

    Die Methode sender() liefert dir einen Zeiger auf ein QObject. Da du aber weißt, dass hier nur QLineEdit-Objekte mit diesem SLOT verbunden haben, kannst du es auf ein QLineEdit casten, damit du alle Methoden davon benutzen kannst (falls du die überhaupt brauchst^^).



    Ein weiterer Tipp: Bitte nicht soviele eigenständige Variablen für die LineEdit-Objekte anlegen. Kannst du doch auch mit einem Array machen, das erspart dir eine Menge Tipparbeit, dann kannst du vieles einfach in Schleifen automatisiert durchführen.

    Ein weiterer Tipp: Wenn du schon soviele LineEdits anlegen musst, dann würde ich überlegen ein anderes Steuerelement dafür zu benutzen. Es gibt QTableWidget und QTableView, welche man ganz hervorragend für solche Sachen benutzen kann. Da musst du dich unbedingt noch etwas einlesen. Dies kostet Zeit und Mühe, spart dir aber für weitere Programme eine Menge Arbeit, weil du nicht den ganzen Kram so umständlich mit 1000 LineEdits durchführen musst... :-)))

    Danke. Du hast mir gerade richtig viel geholfen. Und mit QTableWidgets etc. ist glaub ich gar nicht mal so schlecht. Ich bin jetzt ziemlich weit fortgeschritten, werde es aber bei zukünftigen Versionen & Programmen. :) Ich hoffe mal, die Hilfe von Qt bringt mich da weiter.
    Auch die Array-Tipps werde ich wohl berücksichtigen. :)

    Du scheinst ja ein richtiger Allwissender der Klasse QExperte zu sein. :) Dich merk ich mir. :P
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!