2 Stimmen

Qt. Ist es möglich, eine lokale Variable in connect SLOT() zu verwenden?

void SomeClass::mySlot(MyClass *var){
    ...
}

void SomeClass::SomeFunction(){
    MyClass *myVar;
    QPushButton *button = new QPushButton(this);
    connect(button, SIGNAL(clicked()), this, SLOT(mySlot(myVar)));
}

Ich möchte, dass mySlot myVar erhält, wenn die Schaltfläche angeklickt wird. Ist es möglich, so etwas zu tun? Ich möchte den myVar-Zeiger nicht in SomeClass speichern.

Update (meine Lösung):

void SomeClass::mySlot(){
    QPushButton *button = static_cast<QPushButton*>(sender());  
    MyClass *myVar = qobject_cast<MyClass*>(qvariant_cast<QObject *>(button->property("myVar")));
    ...
}

void SomeClass::SomeFunction(){
    MyClass *myVar;
    QPushButton *button = new QPushButton(this);
    button->setProperty("myVar", QVariant::fromValue((QObject*)myVar));
    connect(button, SIGNAL(clicked()), this, SLOT(mySlot()));
}

3voto

UmNyobe Punkte 21934

Nein, das ist nicht möglich. Sie können einen Slot verwenden, der einige Parameter verwirft, aber nicht einen Slot, der mehr Parameter als das Signal hat. Außerdem können Sie keine Variable übergeben, wenn Sie einen Slot verbinden.

2voto

Mat Punkte 195740

Sie können dies tun mit QSignalMapper (siehe das dortige Beispiel für die Verwendung) mit einigen Einschränkungen, aber Sie müssen sehr vorsichtig mit den Objektlebensdauern sein.

QSignalMapper *signalMapper = new QSignalMapper(this);
MyClass *myVar = new ...;

QPushButton *button = new QPushButton(this);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, myVar);

connect(signalMapper, SIGNAL(mapped(MyClass*)),
         this, SIGNAL(MySlot(MyClass*)));

(Beachten Sie die MyClass muss abgeleitet werden von QObject o QWidget .)

Dies funktioniert so lange, wie das Objekt, auf das die myVar bleibt gültig (d.h. wird nicht gelöscht), aber wenn Sie nicht irgendwo einen Zeiger auf dieses Objekt speichern, können Sie es nicht einfach löschen - Sie könnten also ein Speicherleck haben. (Wenn Sie den Signal-Mapper und den Zeiger auf die Schaltfläche behalten, können Sie das Objekt mit der Methode mapping Mitglied von QSignalMapper .)

Andererseits ist Folgendes zu beachten wird nicht funktionieren :

QSignalMapper *signalMapper = new QSignalMapper(this);
MyClass myVar;
...
signalMapper->setMapping(button, &myVar); // WRONG
...

Dies kann nicht funktionieren, da in diesem Fall das Objekt, auf das von myVar zerstört wird, wenn someFunction endet, so dass der Slot einen ungültigen Zeiger erhält, was zu undefiniertem Verhalten führt (d.h. es könnte alles Mögliche passieren - Fehler, Absturz, Dinge, die manchmal zu funktionieren scheinen, manchmal nicht, ...).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X