6

私の問題は、QMenuBar の項目をクリックすると、対応するスロットが 2 回呼び出されることです。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 ファイルで) コンパイルすると、"Click here" をクリックすると "Triggered" が 1 回、"Or here" が 2 回出力されることがわかります。理由がわかりません。

私は何を間違っていますか?

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 でこの問題が観察されたという 1 つのコメントがあります

新しいバグレポートを提出するのは良い考えだと思います。

于 2012-05-06T21:03:00.717 に答える