2011-01-24 65 views
6

有沒有方法咖喱qt插槽?也許有類似curryng的東西?qt插槽柯里

+0

能否請您給的例子是你心目中的? – 2011-01-24 17:22:53

+0

看起來像http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots – 2011-01-24 19:46:03

回答

1

您可以使用QSignalMapper將一些信號綁定到它上面,然後將它自己的信號連接到帶有一些參數的目標插槽。

// connect signal to mapper 
signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(button1, QString("param1")); 
signalMapper->setMapping(button2, QString("param2")); 
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); 

// connect mapper signal to slot 
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &))); 
2

綁定參數是不可能使用Qt信號/插槽。你將不得不使用boost :: signals和boost :: bind來實現這樣的功能。

+0

的副本LibQxt也是一個選項,請參閱我的答案。 – 2011-01-24 21:49:29

4

儘管不可能直接使用Qt,但通過LibQxt可以獲得一些綁定/ currying。例如,距離的QxtBoundFunction文檔:

到目前爲止,最常用的預期用途是提供一個參數,以當所述 信號不具有提供一個槽。許多新開發Qt的開發人員嘗試編寫如下代碼: \ code connect(button,SIGNAL(clicked()),lineEdit,SLOT(setText(「Hello,world」))); \ endcode 有經驗的Qt開發人員會立即發現這個缺陷。典型的解決方案 用於創建一個簡短的單行封裝插槽來調用所需的功能。一些巧妙的開發人員甚至可以使用QSignalMapper來處理只需要一個 int或QString參數的插槽。

QxtBoundFunction使得這樣寫的前一個連接語句: \代碼 連接(按鈕,SIGNAL(點擊()),QxtMetaObject ::綁定(lineEdit, SLOT(的setText(QString的)),Q_ARG(QString的, 「你好,世界!」))); \ code 這樣做可以實現相同的結果,而無需創建新插槽,或者更糟糕的情況下只需傳遞一個常量值即可。

另外,通過使用QXT_BIND宏的,從信號 參數可被重新安排,省略,或旁邊與Q_ARG宏提供 恆定參數傳遞。例如,這可用於爲通用功能提供有狀態的回調。

可以綁定多種功能。最常見的綁定適用於Qt信號和插槽,但標準C/C++函數也可以綁定。 未來的開發可能會增加綁定到C++成員函數的能力,如果需要,開發人員可以爲自定義的QxtBoundFunction子類提供更多的靈活性。

雖然我已經提交了一些補丁到LibQxt,但我沒有直接使用這個,所以你的里程可能會有所不同。

0

當然,現在我們的Qt 5和信號連接至任意調用對象的能力:

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg)); 

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });