2010-11-11 7 views
14

Ich kann nicht scheinen, ein Argument zu einem Steckplatz übergeben. Wenn ich kein Argument übergebe, läuft die Funktion durch. Wenn ich ein Argument (Integer) übergebe, erhalte ich beim Kompilieren die Fehler "Kein solcher Name Typ" und "Kein solcher Slot".Qt Problem übergeben Argumente an Steckplatz

In meinem Kopf erkläre ich:

private slots: 
void addButton(int); 
signals: 
void clicked(int) 

in meinem Main.cpp, ich mache:

int count; 
int count = 0; 
QPushButton* button = new QPushButton("Button"); 
_layout->addWidget(button); 
connect(button, SIGNAL(clicked(count), this, SLOT(addButton(count))); 

....

void Main::addButton(int count) { 

//do stuff with count 

} 

Antwort

17

Sebastian ist richtig, dass Sie dies nicht in der Art und Weise tun können, wie Sie es versuchen, aber Qt bietet eine Klasse, die Ihnen die gewünschte Funktionalität bietet.

Überprüfen Sie die . Es ermöglicht Ihnen, eine Ganzzahl mit einem Objekt/Signal-Paar zu verknüpfen. Sie verbinden sich dann mit seinen Signalen anstatt direkt mit der Schaltfläche.

+1

ah, das sieht aus wie es funktionieren wird. Vielen Dank! –

8

das Signal und den Schlitz muss die gleiche Anzahl und Typ (e) der Argumente haben, und Sie können nur die Argumente des Signals an den Slot übergeben, nicht irgendeine Variable oder Wert, die Sie wollen.

+0

Bearbeitete den Code oben, um zu widerspiegeln, was ich versuchte (basiert auf einem Beispiel, das ich fand), aber funktioniert noch nicht. –

+0

Das clicked() - Signal wird durch die Button-Klasse definiert, das kann man nicht ändern (außer man schreibt seine eigene Button-Klasse und tut dies, aber ich bezweifle, dass dies die Lösung für alles ist, was man hier versucht). –

3

Ich kann drei Probleme damit sehen.

Zunächst wird das clicked() Signal wird durch QPushButton (ohne Parameter) emittiert wird, aber Sie versuchen, es in Ihrer eigenen Klasse neu zu definieren (mit einem int Parameter). Wenn Sie dies tun wollen:

SignalClass* objectWithSignals = new SignalClass; 
SlotClass* objectWithSlots = new SlotClass; 
connect(objectWithSignals, SIGNAL(a()), objectWithSlots, SLOT(b())); 

dann können Sie nur bereits in SignalClass definiert den Signalen verbinden. Mit anderen Worten, das Signal a() muss zu SignalClass, nicht SlotClass gehören.

(In der Tat ist clicked()QAbstractButton in QPushButton ‚s Basisklasse definiert.)

Zweitens innerhalb der connect() Funktion, müssen Sie mit ihren Parametern Typen die Signal- und Slot-Signaturen spezifizieren. Wo Sie count innerhalb der connect() Funktion haben, sollte es int sein.

Und drittens fehlt eine Klammer in Ihrem Anruf zu verbinden: SIGNAL(clicked(count)).

Hoffe, dass hilft.

+0

Ich bin überrascht, dass deins die einzige Antwort ist, die den Argumentfehler erwähnt, bei dem der Name einer Variablen im Verbindungsaufruf an SIGNAL und SLOT übergeben wird; Der Beispielcode wird niemals kompiliert, es sei denn, "count" ist ein Typ. – pixelgrease

Verwandte Themen