Qt的。是否可以在连接SLOT()中使用局部变量?

时间:2012-02-03 10:46:03

标签: qt signals-slots

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

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

我希望mySlot在单击按钮时接收myVar。 有可能做那样的事吗?我不想将myVar指针存储在SomeClass中。

更新(我的解决方案):

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()));
}

2 个答案:

答案 0 :(得分:3)

不,不可能。您可以使用丢弃某些参数的插槽,但不能使用参数多于信号的插槽。另外,连接插槽时无法传递变量。

答案 1 :(得分:2)

您可以使用QSignalMapper执行此操作(请参阅其中的示例)以获得一些限制,但您需要非常小心对象生存期。

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*)));

(请注意MyClass需要从QObjectQWidget派生。)

只要myVar指向的对象保持有效(即未删除),这将有效,但如果您不在某处存储指向该对象的指针,则无法删除很容易 - 所以你可能会有内存泄漏。 (如果您持有信号映射器和按钮指针,则可以使用mapping QSignalMapper成员恢复该对象。)

另一方面,以下无法使用

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

这不起作用,因为在这种情况下,myVar引用的对象在someFunction结束时被销毁,因此插槽将收到无效指针,这会导致未定义的行为(即任何事情都可能发生 - bug,崩溃,看似有效的事情,有时候不是其他人,......)。