我的问题是,当我点击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文件),你会看到点击&#34;点击这里&#34;将打印&#34;触发&#34;曾经,&#34;或者这里&#34;两次。我不明白为什么。
我做错了什么?
答案 0 :(得分:5)
使用Qt::UniqueConnection
解决:
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(handleAction(QAction*)), Qt::UniqueConnection);
答案 1 :(得分:2)
我使用Qt 4.8.1在Windows 7 x64上获得与您相同的错误结果。这当然看起来像个错误。
在Mac OS X上有一个bug reported and fixed似乎是相同的行为。虽然它已经关闭,但只有一条评论说他们在Windows 7上发现了这个问题。
我认为提交新的错误报告是个好主意。