私の問題は、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回繰り返します。なぜか分からない。
私は間違っていますか?
申し訳ありませんが、私はあなたのコードをコンパイルしないとQtウィザードはないですんでした。しかし、私はノキアのqtのページ(http://qt-project.org/doc/qt-4.8/mainwindows-menus.html)の例を見て、それは彼らが別のスロットのいくつかのスロットにトリガーされた信号を接続するようです方法:SIGNAL(トリガー(QAction *))を接続している間は、SIGNAL(トリガー())を接続します。違いがあるかどうかは分かりませんが、これはコメントであり、回答ではありません:-) – Matthias
@Matthias:これらの例ではアクションがスロットに直接接続されています.pintochは接続QMenuBarのシグナルです。それを意図している。 (アクションを直接作成して接続すると回避策になりますが、いいのではありません - スロット/シグナルマッパーをもっと必要とします...) – Mat
ここでは何をしようとしているのかは不明ですが、あなたが考えているものとは違っています。これは実際にはOSX上でメニューバーを生成しません。 'QMenu'オブジェクトを作成し、それらを' QMenuBar'に追加する必要があります。私はちょうどあなたのスロットにアクションの一覧を送信していると思われる。 –