Re: [問題] Qt QSignalMapper

看板C_and_CPP (C/C++)作者 (Ar藤)時間14年前 (2012/01/06 22:05), 編輯推噓1(1016)
留言17則, 2人參與, 最新討論串3/4 (看更多)
※ 引述《uranusjr (←這人是超級笨蛋)》之銘言: : ※ 引述《Arton0306 (Ar藤)》之銘言: : : QSignalMapper * mapper = new QSignalMapper( menu ); : : for ( unsigned i = 1; i < data.size(); ++i ) : : { : : QAction * action = menu->addAction( tr( getName( data[i] ).c_str() ) ); : : mapper->setMapping( action, data[i] ); : : connect( action, SIGNAL(triggered()), mapper, SLOT(map()) ); : : action->setEnabled( true ); : : } : : connect( mapper, SIGNAL(mapped( unsigned )), this, SLOT(myfunction( unsigned : : )) ); : : 在用Qt的signal和slot時遇到一個問題 : : 為了在動態產生的選單中於按下時傳參數 所以用到了QSignalMapper : : 如果我的slot叫做 : : dumpMax : : 它宣告式差不多會長這個樣子 : : int dumpMax( int x, int y ); : 不太懂你的問題 : QSignalMapper 的用意是要取代一堆相似的 slots : 例如你有一堆選單, 每個按下去的功能都是顯示一個視窗, 只是按不同的會顯示不一樣 : 那麼與其為每一個選單建立一個 slot, 然後重覆寫很多一樣的東西 : 就不如用 QSignalMapper : 然後在 mapped() 所觸發的 slot 裡放個 switch-case 就搞定了 我要做的功能很類似你說的 也就是按不同的選單會顯示不一樣 不過觸發的slot本身是一個接收兩個整數值的function 這個slot是在這個選單還沒完成的時候就已經寫好的function 它本身就有自己的功能,不是為了當這個選單的slot而存在 後來程式增加新功能,照理說這個選單按下去只要把2個值傳給這個function就完成了, 但現在問題在於選單按下去只能傳上述的4種參數,而沒辦法傳兩個值 所以我現在不知道怎麼做會比較漂亮 : void QSignalMapper::mapped(int) 和 void QSignalMapper::mapped(QObject *) : 和其他同系列的函數所帶的那個參數, 就是用來識別發出該訊號的物件而已 : 如果你只是想讓動態產生的 action 能被連結到一個 slot : 那直接 connect 就可以了, Qt 裡的 connect/disconnect 本來就是動態的 : 根本不需要用到 QSignalMapper -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.140.149

01/06 22:22, , 1F
問題是 triggered 不帶參數,它要怎麼對應到帶兩個
01/06 22:22, 1F

01/06 22:22, , 2F
參數的 slot?
01/06 22:22, 2F

01/06 22:37, , 3F
這正是一開始的問題XD 後來聽說可以QSignalMapper
01/06 22:37, 3F

01/06 22:37, , 4F
但又發現QSignalMapper的參數又有限制
01/06 22:37, 4F

01/07 00:21, , 5F
no~~QSignalMapper 解決的不是這種問題 :)
01/07 00:21, 5F

01/07 00:24, , 6F
這問題基本要看你的參數從哪來
01/07 00:24, 6F

01/07 00:25, , 7F
反正都是要弄個 adapter: void() => void(T a, U b)
01/07 00:25, 7F

01/07 00:40, , 8F
可否再給些指引 我的參數是在產生menu的過程而來
01/07 00:40, 8F

01/07 00:42, , 9F
情況是:使用者會在一個table上按右鍵 接著跑出一個menu
01/07 00:42, 9F

01/07 00:43, , 10F
這個menu的內容 是根據使用者在哪一個row上而有變化
01/07 00:43, 10F

01/07 00:44, , 11F
使用者在menu上點選後 需要把table上的#row 與menu上哪
01/07 00:44, 11F

01/07 00:45, , 12F
個item傳給一個slot (這裡描述的情況有簡化過)
01/07 00:45, 12F

01/07 00:46, , 13F
(實際上menu有三層 不過確實需要傳2個參數)
01/07 00:46, 13F

01/07 01:11, , 14F
action 是在 contextMenuEvent 上產生的吧?
01/07 01:11, 14F

01/07 01:12, , 15F
那就在 QTableView 裡用 member 記這幾個參數就可以了
01/07 01:12, 15F

01/07 01:13, , 16F
反正同一時間使用者只會有一個 context menu
01/07 01:13, 16F

01/07 01:42, , 17F
感謝!
01/07 01:42, 17F
文章代碼(AID): #1F1l-Qgr (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 3 之 4 篇):
文章代碼(AID): #1F1l-Qgr (C_and_CPP)