我的问题是,当我点击QMenuBar中的一个项目时,相应的插槽会被调用两次。我正在使用Qt 4.8.1。我没有使用Qt Designer,也没有使用“自动连接”功能。这里是我的代码片段:为什么此槽被调用两次?
#include <iostream>
#include <QWidget>
#include <QMenuBar>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0) : QWidget(parent)
{
QMenuBar *menu = new QMenuBar(this);
menu->addAction("Click here");
menu->addAction("Or here");
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(handleAction(QAction*)));
}
public slots:
void handleAction(QAction *action)
{
std::cout << "Triggered" << std::endl;
}
};
和主要功能:
#include "main.h"
#include <QApplication>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyWidget w;
w.show();
return app.exec();
}
如果您编译这个(与MOC文件),你会看到,点击“点击这里”将打印“触发“一次,和”或这里“两次。我不明白为什么。
我在做什么错?
对不起,我没有编译代码,我不Qt的向导。但我查看了诺基亚qt页面的例子(http://qt-project.org/doc/qt-4.8/mainwindows-menus.html),在我看来,他们将触发信号连接到不同的插槽方式:当你连接SIGNAL(触发(QAction *))时,它们连接SIGNAL(triggered())。不知道它是否有所作为,但这是一个评论,而不是一个答案:-) – Matthias
@Matthias:他们将动作直接连接到这些示例中的插槽,pintoch是连接QMenuBar的信号,这应该与他一样工作打算这样做。 (直接创建和连接操作将是一种解决方法,但不是很好 - 他/她需要更多的插槽或信号映射器......) – Mat
目前尚不清楚你在这里做什么*尝试*,但我怀疑它是某种东西不同,你认为 - 这实际上甚至不会在OSX上产生菜单栏。你应该创建'QMenu'对象并将它们添加到'QMenuBar'中。我怀疑这只是将整个动作列表发送到您的插槽。 –