6

我的问题是,当我单击 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 文件),您会看到单击“单击此处”将打印一次“触发”,并打印两次“或此处”。我不明白为什么。

我究竟做错了什么 ?

4

2 回答 2

5

用于Qt::UniqueConnection解决:

connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(handleAction(QAction*)), Qt::UniqueConnection);

http://doc.qt.io/qt-4.8/qt.html#ConnectionType-enum

于 2014-07-30T18:02:09.603 回答
2

在使用 Qt 4.8.1 的 Windows 7 x64 上,我得到了与您相同的错误结果。这当然看起来像一个错误。

报告并修复了一个错误,该错误在 Mac OS X 上似乎具有相同的行为。虽然它已被关闭,但有一条评论表明他们在 Windows 7 上观察到了这个问题。

我认为提交新的错误报告将是一个好主意。

于 2012-05-06T21:03:00.717 回答