如何在Qt中声明动态插槽功能?

时间:2015-12-18 09:51:53

标签: qt

首先,对不起我的英语。

最近,我正在开发一个支持插件的Qt项目。在我的程序中,我想在程序启动时为每个插件加载插件并创建 QAction 实例。然后我遇到了问题:当 QAction 实例被触发时,我怎么知道触发了哪一个? ( QAction trigger()信号没有参数)

首先,我考虑使用 connect 进行动态信号插槽连接。但这需要为每个 QAction 实例动态声明插槽功能。我不知道如何实施。

然后我有另一个想法。我尝试实现一个继承 QAction 的新类 MyAction 。当它被触发时,我可以用必要的参数发出我自己的信号。这是一些代码。

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);}
};

然而,没有&#34;触发!&#34;在控制台中。

我会感激任何建议!

2 个答案:

答案 0 :(得分:3)

public override object ExecuteScalar() 函数将返回指向已发送相应信号的对象的指针。您可以在插槽中调用它,例如:

QObject::sender()

我在这里使用void onActionTrigger() { QAction *action = qobject_cast<QAction *>(sender()); [..] } 因为qobject_cast函数返回指向sender()的指针。

答案 1 :(得分: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()的模板参数 - 你需要添加它们来选择信号和插槽的正确重载,但我并不想要杂乱无章上面的代码。