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)