[gelöst] Probleme mit ComboBox und SignalMapper

Alles rund um die Programmierung mit Qt
Antworten
Fenriswolf
Beiträge: 27
Registriert: 11. November 2014 18:06

[gelöst] Probleme mit ComboBox und SignalMapper

Beitrag von Fenriswolf »

N Abend liebes Forum,
ich stell mich grad mal wieder zu doof an und bitte daher um eure Hilfe:
Ich habe ein TableWidget erstellt, in dem ich in der letzten Spalte ComboBoxen einfüge. Diese ComobBoxen sind für die Farbauswahl. Da beim Klick darauf immer wieder das gleiche Ereignis ausgelöst wird, und ich die Zeile benötige, habe ich mir gedacht das ganze per SignalMapper zu machen (ist das erste mal, dass ich damit arbeite)

Hier mein Code:
HEADER:

Code: Alles auswählen

private slots:
    void cmbColor_changed(const QString &arg1);
SOURCE:

Code: Alles auswählen

void Options::showDialog()
{
    widget = new QWidget(this);
    QPushButton *btnok = new QPushButton(widget);
    btnok->setText("OK");
    btnok->setGeometry(110, 210, 70, 25);
    btnok->show();
    connect(btnok, SIGNAL(clicked()), this, SLOT(btnok_clicked()));
    QPushButton *btncancel = new QPushButton(widget);
    btncancel->setText("Abbrechen");
    btncancel->setGeometry(20, 210, 70, 25);
    btncancel->show();
    connect(btncancel, SIGNAL(clicked()), this, SLOT(btncancel_clicked()));
    TblWid = new QTableWidget(1, 3, widget);
    QStringList header;
    header << "Bezeichnung" << "Abk" << "Farbe";
    TblWid->setHorizontalHeaderLabels(header);
    TblWid->setColumnWidth(0, 100);
    TblWid->setColumnWidth(1, 30);
    TblWid->setColumnWidth(2, 150);
    TblWid->verticalHeader()->hide();
    TblWid->verticalHeader()->setDefaultSectionSize(25);
    TblWid->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    TblWid->setShowGrid(false);
    TblWid->resize(300,200);
    TblWid->setFixedSize(TblWid->size());
    widget->resize(300,250);
    widget->setFixedSize(widget->size());

    QSignalMapper *SigMap = new QSignalMapper(this);

    for(int i = 0; i <= 10; ++i)
    {
        QComboBox *cmbColor = new QComboBox;
        const QStringList colorNames = QColor::colorNames();
        int index = 0;
        foreach (const QString &colorName, colorNames)
        {
            const QColor color(colorName);
            cmbColor->addItem(colorName, color);
            const QModelIndex idx = cmbColor->model()->index(index++, 0);
            cmbColor->model()->setData(idx, color, Qt::BackgroundColorRole);
        }
        connect(cmbColor, SIGNAL(currentIndexChanged(const QString)), this, SLOT(map()));
        SigMap->setMapping(cmbColor, i);
        TblWid->setCellWidget(i, 2, cmbColor);
    }
    connect(SigMap, SIGNAL(mapped(const QString)), TblWid, SLOT(cmbColor_changed(const QString)));
}

void Options::cmbColor_changed(const QString &arg1)
{
    QComboBox* cmbColor = dynamic_cast<QComboBox*>(sender());

}
Das Problem: cmbColor_changed wird nicht ausgelöst. (ich weiß nicht, ob das so sein soll aber noch was: Beim Debuggen wird mir für "SigMap - [signals] - [connections] - <0 Elemente>" angezeigt)
Ich habe schon alle möglichen Seiten abgesucht, um dem Näher zu kommen. aber ich finds nicht

Wie immer schon mal im voraus vielen Dank für eure Hilfe.

Mfg
Fenriswolf
Zuletzt geändert von Fenriswolf am 23. Dezember 2014 13:33, insgesamt 1-mal geändert.
Ich bin die Summer meiner Erfahrungen; und heute bin ich mehr, als ich gestern war
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Probleme mit ComboBox und SignalMapper

Beitrag von MichaelS »

Moin,

Du mappst die Signale auf einen Integer

Code: Alles auswählen

SigMap->setMapping(cmbColor, i);
und hinterher soll ein String bei herauskommen:

Code: Alles auswählen

connect( SigMap, SIGNAL( mapped( const QString ) ), TblWid, SLOT( cmbColor_changed( const QString ) ) );
Das kann nicht funktionieren. Wenn Du das Signal der ComboBoxen auf die Zeilennummer mappst, gibt das Signal mapped des QSignalMapper natürlich auch die Zeilenummer zurück:

Code: Alles auswählen

connect( SigMap, SIGNAL( mapped( int ) ), this, SLOT( cmbColor_changed( int ) ) );
Du kannst Dir aber auch - statt der Zeilennummer - einen Pointer auf die ComboBox geben lassen:

Code: Alles auswählen

SigMap->setMapping( cmbColor, cmbColor );

...

connect( SigMap, SIGNAL( mapped( QObject* ) ), this, SLOT( cmbColor_changed( QObject* ) ) );

void Options::cmbColor_changed( QObject*  object)
{
    QComboBox* cmbColor =  qobject_cast<QComboBox *>( object );
    ...
}

Fenriswolf
Beiträge: 27
Registriert: 11. November 2014 18:06

Re: Probleme mit ComboBox und SignalMapper

Beitrag von Fenriswolf »

Hallo Michael,
ups... vielen Dank dafür :oops:

hab selbst auch noch n kleinen fehler gefunden:
statt:
connect(cmbColor, SIGNAL(currentIndexChanged(int)), this, SLOT(map()));

lieber:
connect(cmbColor, SIGNAL(currentIndexChanged(int)), SigMap, SLOT(map()));


jetzt hab ich nur noch n kleines problem:
ich brauche sowohl die Zeile, als auch den Text aus der ComboBox.
soweit ich das bisher sehe, kann ich aber nur eines Übertragen. Oder kann ich, aus der übertragenen CB die Zeile auslesen?

Mfg
Fenriswolf
Ich bin die Summer meiner Erfahrungen; und heute bin ich mehr, als ich gestern war
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Probleme mit ComboBox und SignalMapper

Beitrag von MichaelS »

Fenriswolf hat geschrieben:ich brauche sowohl die Zeile, als auch den Text aus der ComboBox.
soweit ich das bisher sehe, kann ich aber nur eines Übertragen. Oder kann ich, aus der übertragenen CB die Zeile auslesen?
Du kannst Dir eine Liste mit den Pointern auf die ComboBoxen anlegen, die Du in Deiner Schleife zuweist:

Code: Alles auswählen

QList<QComboBox*> comboList;

for( int i = 0; i <= 10; ++i)
{
   QComboBox *cmbColor = new QComboBox;
   comboList.append( cmbColor );
   ...
}
Wenn Dir der SignalMapper die Zeilennummer gibt, kannst Du Dir daraus den Ponter auf die ComboBox und den entsprechenden Text holen:

Code: Alles auswählen

QString text = comboList.value( zeile )->currentText();
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Probleme mit ComboBox und SignalMapper

Beitrag von Christian81 »

Das geht auch komplett ohne QSignalMapper einfach mittels QObject::sender().
Bei der Lösung von MichaelS sollte man noch auf != NULL prüfen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Fenriswolf
Beiträge: 27
Registriert: 11. November 2014 18:06

Re: Probleme mit ComboBox und SignalMapper

Beitrag von Fenriswolf »

@Michael:
danke, ist zwar irgendwie umständlich, die ganze liste nochmal zwischen zu speichern. aber es führt zum Ziel.

@Christian:
wie bekomm ich ohne den SignalMapper die Zeile übertragen?
Ich bin die Summer meiner Erfahrungen; und heute bin ich mehr, als ich gestern war
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Probleme mit ComboBox und SignalMapper

Beitrag von Christian81 »

Stimmt - das ist ja ein QTableWidget ... habe ich übersehen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Probleme mit ComboBox und SignalMapper

Beitrag von MichaelS »

Fenriswolf hat geschrieben: wie bekomm ich ohne den SignalMapper die Zeile übertragen?
Mal so aus der Hüfte geschossen: Wenn Du die Pointer in einer Liste hältst und sender() Dir einen Pointer darauf zurückgibt, dann könntest Du Zeile ja auch ermitteln, in dem Du den Pointer in der Liste ( mit indexOf() ) suchst. Wenn Du einen Index größer gleich 0 bekommst, dann müsste das ja die Zeilennummer sein.
Antworten