2012-02-03 35 views
2
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。 是否有可能做这样的事情?我不想在SomeClass中存储myVar指针。Qt。可以在连接SLOT()中使用局部变量吗?

更新(我的解决方案):

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

您的解决方案不可能工作。 'connect'调用将失败。 – TonyK 2012-02-03 11:37:00

+0

我错了,而复制粘贴。我纠正了'connect'。谢谢你的评论! – Eddie 2012-02-03 11:39:11

回答

3

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

+0

感谢您的回答! – Eddie 2012-02-03 10:59:39

+0

有效地,连接函数只是匹配函数调用的签名。 – 2012-02-03 11:01:13

+1

这个答案并不正确。有可能做一些@Eddie想要的 - 有一些限制,但这不是“不可能的”。 – Mat 2012-02-03 11:11:32

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仍然有效(即不被删除),但如果你不不会在某处存储指向该对象的指针,您将无法轻松删除它 - 因此可能会发生内存泄漏。 (如果你持有到信号映射器和按钮的指针,你可以恢复与QSignalMappermapping成员是对象。)

在另一方面,下面的将无法​​正常工作

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

这是行不通的,因为在这种情况下,当someFunction结束时myVar引用的对象被销毁,所以该槽将收到一个无效指针,导致未定义的行为(即任何事情都可能发生 - 错误,崩溃,似乎有效的东西有时不会其他, ...)。

+2

很好的解决方案。但我决定使用以下内容: button-> setProperty(“myVar”,QVariant :: fromValue((QObject *)myVar)); (连接前) MyClass * myVar = qobject_cast (qvariant_cast (static_cast (sender()) - > property(“myVar”))); (在插槽中) – Eddie 2012-02-03 11:13:42

相关问题