Anfängerfrage Slots/Signals

Alles rund um die Programmierung mit Qt
Antworten
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Anfängerfrage Slots/Signals

Beitrag von otternase »

Hallo

ich bin absoluter Qt Anfänger und stehe gleich bei einem vmtl. eher einfachen Problem auf dem Schlauch:

Ich möchte bei Änderung des Index einer ComboBox im GUI ein Label ändern:

die Header Datei sieht wie folgt aus:

Code: Alles auswählen

#ifndef UI_TESTDIALOG_H
#define UI_TESTDIALOG_H

#include <QVariant>
#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QComboBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QGraphicsView>
#include <QLabel>
#include <QSpinBox>
#include <QObject>

class Ui_testdialog: public QObject
{
	Q_OBJECT
	
public:
    ...
    QComboBox *comboBox;
    QLabel *label;

    void setupUi(QDialog *);
	
	public slots:
		void setzValue(QString);

	signals:
		void writeValue(QString);
};

namespace Ui {
    class testdialog: public Ui_testdialog {};
} // namespace Ui
in der ui_testdialog.cpp habe ich folgendes stehen:

Code: Alles auswählen

#include "ui_testdialog.h"

void Ui_testdialog::setupUi(QDialog *testdialog)
{
...
    comboBox = new QComboBox(testdialog);
...
    label = new QLabel(testdialog);
...
    QObject::connect(comboBox, SIGNAL(currentIndexChanged(QString)), testdialog, SLOT(setzValue(QString)));
    QObject::connect(testdialog, SIGNAL(writeValue(QString)), label, SLOT(setText(QString)));
	
    QMetaObject::connectSlotsByName(testdialog);
} // setupUi

void Ui_testdialog::setzValue(QString str)
{
        // ... hier soll mit dem String noch was passieren, aber das ist vorerst irrelevant
	emit writeValue(str);
}
Das Problem ist, dass bei Änderung des ausgewählten Items in der Box sich nichts tut.
Konnektiere ich direkt, dann funktioniert es hingegen, folgendes funktioniert also:

Code: Alles auswählen

  QObject::connect(comboBox, SIGNAL(currentIndexChanged(QString)), label, SLOT(setText(QString)));
Was mache ich falsch?

Danke
Markus
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

testdialog ist doch ne Klasse, connecten geht aber bloß mit bereits instantiierten Objekten ;)
Da das Signal aus deiner Klasse stammt ersetzt du die zweite "coonect"-Zeile deines Konstruktors durch Folgende:

Code: Alles auswählen

QObject::connect(this, SIGNAL(writeValue(QString)), label, SLOT(setText(QString))); 
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

Das ist es leider noch nicht.

Vielleicht hätte ich auch den Aufruf noch dazu schreiben sollen. Also, die GUI wird aus einem anderen Programm aus aufgerufen:

Code: Alles auswählen

	
...
    QDialog *dialog = new QDialog;
    Ui::testdialog ui;
    ui.setupUi(dialog);
	
    dialog->show();
...
Wenn ich es recht verstehe, dann ist doch "dialog" ein QDialog-Object, welches an setupUi übergeben wird und dort "testdialog" heisst.

Sonst würden diese Zeilen doch auch nicht funktionieren:?

Code: Alles auswählen

    QObject::connect(buttonBox, SIGNAL(accepted()), testdialog, SLOT(accept()));
    QObject::connect(buttonBox, SIGNAL(rejected()), testdialog, SLOT(reject()));
:? Confused
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Moin,

guck dir nochmal genau die Parameter deines Signals currentIndexChanged(QString) an und wirf dann mal einen Blick an die entsprechende Stelle in der Doku.
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

@Flachkoepper

Das war mit Sicherheit ein Wink mit dem Zaunpfahl, nur ist er wirkungslos an mir vorübergegangen :-( Kannst Du nochmal winken?

Ich habe folgendes mal ausprobiert, leider auch ohne Erfolg:

Code: Alles auswählen

	numb = new QLCDNumber(testdialog);
    QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), testdialog, SLOT(setzValue(int)));
    QObject::connect(testdialog, SIGNAL(writeValue(int)), numb, SLOT(display(int)));
...
void Ui_testdialog::setzValue(int index)
{
	emit writeValue(index);
	
}
und in der .h:

Code: Alles auswählen

	public slots:
		void setzValue(int);

	signals:
		void writeValue(int);
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Nun, in der Doku steht

currentIndexChanged(const QString&);

bei dir aber

currentIndexChanged(QString);

Wenn du die Konsole anhättest (mittels hinzufügen von CONFIG += console in deinem pro-file zu erreichen), dann würde beim Programmdurchaluf eine entsprechende Meldung auftauchen, sowas wie "no such signal currentIndexChanged(QString)".

Gruß.
F
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Noch immer verwirrt

Beitrag von otternase »

Hallo

danke für Deine Antwort, aber es bleibt für mich dennoch etwas offen:

Warum funktioniert folgendes:

Code: Alles auswählen

numb = new QLCDNumber(testdialog);
    QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)),  numb, SLOT(display(int))); 
hingegen dieses nicht:

Code: Alles auswählen

   numb = new QLCDNumber(testdialog);
    QObject::connect(comboBox, SIGNAL(currentIndexChanged(int)), testdialog, SLOT(setzValue(int)));
    QObject::connect(testdialog, SIGNAL(writeValue(int)), numb, SLOT(display(int)));
...
void Ui_testdialog::setzValue(int index)
{
   emit writeValue(index);
} 
mit der Definition im Header:

Code: Alles auswählen

 public slots:
      void setzValue(int);

   signals:
      void writeValue(int);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

testdialog ist im Konstruktor nur lokal. Entweder brauchst du einen Pointer auf testdialog als Member - oder du nimmst beim connect parent() (gegebenenfalls musst du das noch casten).
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

So, hab mir das nochmal genauer angesehen. Ob nun const QString& oder QString scheint ihn nicht zu stören. Hmm, ich meine, ich hätte da mal Probleme mit gehabt. Naja, egal.
Also, bevor ich dir jetzt weiterhelfe, schalt deine Konsole an (ich schätze du bist unter Windows) und dann guck dir mal die Fehlermeldungen an.

Wenn du dann noch nicht drauf kommst, was falsch läuft, weißt ja, wo du Hilfe findest...

Gruß
Antworten