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()));
}
答案 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
需要从QObject
或QWidget
派生。)
只要myVar
指向的对象保持有效(即未删除),这将有效,但如果您不在某处存储指向该对象的指针,则无法删除很容易 - 所以你可能会有内存泄漏。 (如果您持有信号映射器和按钮指针,则可以使用mapping
QSignalMapper
成员恢复该对象。)
另一方面,以下无法使用:
QSignalMapper *signalMapper = new QSignalMapper(this);
MyClass myVar;
...
signalMapper->setMapping(button, &myVar); // WRONG
...
这不起作用,因为在这种情况下,myVar
引用的对象在someFunction
结束时被销毁,因此插槽将收到无效指针,这会导致未定义的行为(即任何事情都可能发生 - bug,崩溃,看似有效的事情,有时候不是其他人,......)。