2012-05-06 21 views
5

私の問題は、QMenuBarで項目をクリックすると、対応するスロットが2回呼び出されるということです。私はQt 4.8.1を使用しています。 Qt Designerや「自動接続」機能を使用していません。ここに私のコードスニペットは、次のとおりです。なぜこのスロットは2回呼び出されるのですか?

#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ファイルを使用して)これをコンパイルする場合、あなたは「こちらをクリック」をクリックすると、「印刷されていることがわかります「トリガー」を1回、「ここ」を2回繰り返します。なぜか分からない。

私は間違っていますか?

+0

申し訳ありませんが、私はあなたのコードをコンパイルしないとQtウィザードはないですんでした。しかし、私はノキアのqtのページ(http://qt-project.org/doc/qt-4.8/mainwindows-menus.html)の例を見て、それは彼らが別のスロットのいくつかのスロットにトリガーされた信号を接続するようです方法:SIGNAL(トリガー(QAction *))を接続している間は、SIGNAL(トリガー())を接続します。違いがあるかどうかは分かりませんが、これはコメントであり、回答ではありません:-) – Matthias

+0

@Matthias:これらの例ではアクションがスロットに直接接続されています.pintochは接続QMenuBarのシグナルです。それを意図している。 (アクションを直接作成して接続すると回避策になりますが、いいのではありません - スロット/シグナルマッパーをもっと必要とします...) – Mat

+0

ここでは何をしようとしているのかは不明ですが、あなたが考えているものとは違っています。これは実際にはOSX上でメニューバーを生成しません。 'QMenu'オブジェクトを作成し、それらを' QMenuBar'に追加する必要があります。私はちょうどあなたのスロットにアクションの一覧を送信していると思われる。 –

答えて

2

Windows 7 x64でQt 4.8.1を使用した場合と同じ結果になります。これは確かにバグのようです。

bug reported and fixedは、それが閉じられていたが、マックOS X上同じ動作と思われるもののためにあった、彼らは私が提起だと思うのWindows 7

上でこの問題を観察することをその上に単一のコメントがあります新しいバグ報告が良い考えです。

+0

私はバグトラッカーに新しい問題を作成します。ご確認いただきありがとうございます。 – pintoch

関連する問題