Seite 1 von 1

Hilfe bei Benutzung des QSignalMapper

Verfasst: 10. Januar 2008 11:01
von Qt_Starter
Hallo,

ich hoffe es kennt sich jemand mit dem QSignalMapper aus.
Ich will zur Laufzeit des Programmes entscheiden, wieviele QLineEdits ich benötige. Deshalb suche ich jetzt eine Möglichkeit wie ich dann den Inhalt(text) des LineEdits speichern kann.
Mit meinem jetztigen Code merke ich zwar, wenn sich etwas geändert hat, komme aber nicht an den Inhalt des LineEdits.

Hier mein Code:

Code: Alles auswählen

#include "ButtonWidget.h"
#include <QLineEdit>


ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
     : QWidget(parent)
 {
     signalMapper = new QSignalMapper(this);

     QGridLayout *gridLayout = new QGridLayout;

     for (int i = 0; i < texts.size(); ++i)
    {
       QLineEdit *lineEdit = new QLineEdit(texts[i]);
   
         connect(lineEdit, SIGNAL(textChanged(const QString & )), signalMapper, SLOT(map()));
         signalMapper->setMapping(lineEdit, texts[i]);
         gridLayout->addWidget(lineEdit, i / 3, i % 3);

     }

    connect(signalMapper, SIGNAL(mapped(const QString &)),
             this, SLOT(specialSlot(const QString &)));

     setLayout(gridLayout);   
 }

ButtonWidget::~ButtonWidget()
{
}

void ButtonWidget::specialSlot(const QString& name)
{
   QString value;
   value = name;
}
Kann mir da vielleicht jemand helfen?

Verfasst: 10. Januar 2008 11:23
von Korgen
Hallo,
in einem Slot liefert dir die Methode sender() ein QObject*, dass du dann nach QLineEdit* casten könntest und dann über die text() Methode an den Inhalt des LineEdits kommst.

Grüße

@Korgen

Verfasst: 10. Januar 2008 11:33
von Qt_Starter
Das wollte ich auch schon versuchen, jedoch habe ich da noch das Problem, wenn ich den map - Slot so ändere, dann springt er mir nicht mehr in den von mir definierten Slot specialSlot.
Könntest du mir da ein Beispiel zeigen?

Verfasst: 10. Januar 2008 12:53
von Christian81
Bist Du sicher dass (const QString& name nicht den aktuellen Text enthält? Laut Doku ist das nämlich der Fall

@Christian

Verfasst: 10. Januar 2008 15:56
von Qt_Starter
Vielleicht hab ich es auch nur falsch verstanden, deshalb frag ich jetzt nochmal genauer nach.

Wenn ich das QLineEdit erzeuge, setze ich mit dem hier verwendeten Konstruktor den Inhalt des LineEdits (die "text" - Eigenschaft) oder?

Code: Alles auswählen

QLineEdit *lineEdit = new QLineEdit(texts[i]);
Und im Anschluss, wenn ich die Methode "setMapping" ausführe, dann gebe ich dem jeweiligen LineEdit einen Namen und verändere nicht den Text, oder versteh ich das falsch?

Code: Alles auswählen

connect(lineEdit, SIGNAL(textChanged(const QString &)), signalMapper, SLOT(map()));
signalMapper->setMapping(lineEdit, NameList[i]);
Am Ende würde ich gern den Inhalt und den Namen des LineEdits bekommen. Wenn es geht, dann vielleicht in der Art:

Code: Alles auswählen

connect(signalMapper, SIGNAL(mapped(QLineEdit *)),
             this, SLOT(specialSlot(QLineEdit *)));

Code: Alles auswählen

void fstTestProject::specialSlot(QLineEdit *lineWidget)
{
         QLineEdit * copyOfLineEdit = new QLineEdit;
         copyOfLineEdit = lineWidget;
         QString objName = copyOfLineEdit->objectName();

         QString Value = copyOfLineEdit->text();
}
Ist das überhaupt möglich? Wenn ja, würde ich mich über ein praktisches Beispiel freuen.

PS: in meinem dem Beispiel oben bekomm ich dann leider nur den "Namen" und nicht den Inhalt wieder.

Re: @Christian

Verfasst: 10. Januar 2008 18:14
von solarix
Vielleicht hab ich es auch nur falsch verstanden,
ja
setze ich mit dem hier verwendeten Konstruktor den Inhalt des LineEdits
ja
dann gebe ich dem jeweiligen LineEdit einen Namen
Nein.. du gibst dem Map (!) einen (Identifikations-)Namen.. damit erkennst du, von wem das Signal geworfen wurde (da wird IMHO wieder genau dieser String mitgegeben..)
Am Ende würde ich gern den Inhalt und den Namen des LineEdits
Via Objektnamen wuerde es dann so gehen:
1. Beim erstellen der Line-Edits erzeugst du einen einmaligen Namen und setzt diesen auf das Lineedit (setObjectName)
2. Diesen Namen gibst du dann beim setMapping an
3. Im Slot erhaelst dann den Objekt-Namen. Nun kannst du dein LineEdit mit "findChild" ermitteln..

Oder du mappst nicht ein String, sondern den (bereits eindeutigen) Pointer mit der anderen setMapping-Methode. Dann erhaelst du im Slot gleich den Pointer auf dein Line-Edit...

hth..


PS.

Code: Alles auswählen

 QLineEdit * copyOfLineEdit = new QLineEdit;
  copyOfLineEdit = lineWidget; 
AUTSCH!

@solarix

Verfasst: 10. Januar 2008 20:24
von Qt_Starter
Vorab Danke für den Tip! So funktioniert es jetzt :D!
Oder du mappst nicht ein String, sondern den (bereits eindeutigen) Pointer mit der anderen setMapping-Methode. Dann erhaelst du im Slot gleich den Pointer auf dein Line-Edit...
Und wie würde das dann aussehen, wenn ich mit der "anderen" setMapping-Methode den Pointer mappen würde, hast du da vielleicht ein Beispiel?