首先,对不起我的英语。
最近,我正在开发一个支持插件的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;在控制台中。
我会感激任何建议!
答案 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()
的模板参数 - 你需要添加它们来选择信号和插槽的正确重载,但我并不想要杂乱无章上面的代码。