2012-02-03 34 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

相關問題