看板 C_and_CPP 關於我們 聯絡資訊
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 但QSignalMapper的signal只有下面4種 void mapped ( int i ) void mapped ( const QString & text ) void mapped ( QWidget * widget ) void mapped ( QObject * object ) 現在假設我希望傳 2 個以上的參數 (前面的程式碼是要傳unsigned的例子) 網路上建議是建一個subclass derived from QObject再傳 還有人說如果是兩個整數就自己合成一個QString 到slot那再parse 但不管哪個方法都很怪 如果我的slot叫做 dumpMax 它宣告式差不多會長這個樣子 int dumpMax( int x, int y ); 但受制於QSignalMapper,它就得要改成 int dumpMax( QObject * object ); 而且函數內還要加上 將兩個數值取出的code 可讀性就比兩參數版本的要差很多 若是我有其它的地方要以一般函數的方式呼叫dumpMax 還要改成傳QObject,或者是重載這個function 不知道是否有較漂亮的寫法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.192.162.252 ※ 編輯: Arton0306 來自: 220.135.140.149 (01/06 23:12)