Hilfe bei Benutzung des QSignalMapper

Alles rund um die Programmierung mit Qt
Antworten
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

Hilfe bei Benutzung des QSignalMapper

Beitrag 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?
Korgen
Beiträge: 42
Registriert: 28. März 2006 16:37

Beitrag 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
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

@Korgen

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Bist Du sicher dass (const QString& name nicht den aktuellen Text enthält? Laut Doku ist das nämlich der Fall
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

@Christian

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: @Christian

Beitrag 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!
Qt_Starter
Beiträge: 23
Registriert: 16. November 2007 21:04

@solarix

Beitrag 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?
Antworten