2015-12-18 20 views
0

首先,我的英語很抱歉。如何在Qt中聲明動態插槽功能?

最近我正在開發一個支持插件的Qt項目。在我的程序中,我想加載插件,並在程序啓動時爲每個插件創建實例。然後我遇到了這個問題:當觸發實例時,如何知道哪一個被觸發? (的QAction觸發()信號沒有參數)

首先,我考慮使用連接動態信號槽連接。但是這需要動態聲明插槽功能,以便每個實例都可以使用。我不知道如何實施。

然後我有另一個想法。我嘗試實施一個新的類MyAction,它繼承了QAction。當它被觸發時,我可以用必要的參數發出我自己的信號。這裏有一些代碼。

class MyAction: public QAction 
{ 
public: 
    int ID; 
    MyAction(); 
    MyAction(const QIcon & icon, const QString & text, QObject * parent, int id) 
    : QAction(icon, text, parent) 
     {ID = id;} 
    ~MyAction(); 

signals: 
    void clicked(int id); 

public slots: 
    void trigger(){qDebug() << "triggered!"; emit clicked(ID);} 
}; 

但是,沒有「觸發」!在控制檯中。

我會感激任何建議!

回答

3

QObject::sender()函數將返回指向已發送相應信號的對象的指針。你可以把它在你的插槽,如:

void onActionTrigger() 
{ 
    QAction *action = qobject_cast<QAction *>(sender()); 
    [..] 
} 

我用qobject_cast這裏是因爲sender()函數返回一個指針QObject

+0

這就是我需要激動的!非常感謝! – Paler

1

您可以使用QSignalMapper將一個整數,字符串或指針與信號的發件人關聯到窗口小部件或對象。這裏有一個如何使用它的(未經測試)概要:

// connect actions to map 
auto mapper = new QSignalMapper(this); 
connect(mapper, &QSignalMapper::mapped, this, &Myclass::trigger); 

for (QAction *a: actions) { 
    mapper.setMapping(a, a->text()); 
    connect(a, &QAction::triggered, mapper, &QSignalMapper::map); 
} 
// slot implementation 
void Myclass::trigger(QString text) 
{ 
    qDebug() << "triggered by action" << text; 
} 

我已經離開了模板參數connect() - 你需要將它們添加到選擇信號的正確重載和插槽,但我不想混亂上面的代碼。