2012-02-07 11 views
1

QObject::connect()にenumパラメータを使用しようとしています。私はQObject :: connect()with enum parameters

QObject::connect: Incompatible sender/receiver arguments 
     Calendar::calendarExceptionThrown(Calendar*,ExceptionType) 
    --> CalendarDBView::handleCalendarException(Calendar*,Calendar::ExceptionType) 

...このメッセージを得た接続コードは次のとおりです。

connect(cal, SIGNAL(calendarExceptionThrown(Calendar*,ExceptionType)), 
     this, SLOT(handleCalendarException(Calendar*,Calendar::ExceptionType))); 

私が何を読んでから、私は私がCalendarのクラス定義にこれを追加する必要考え出し:

Q_ENUMS(ExceptionType) 

私はmain.cppにこれを追加しました:

qRegisterMetaType<Calendar::ExceptionType>("ExceptionType"); 

まだ警告メッセージが表示されています。 This related threadは私の問題を解決しませんでした。私は間違って何をしていますか?

+0

接続を行っている場所のどこに行を投稿できますか?タイプを 'Calendar :: ExceptionType'として登録しようとしましたか? – Mat

+0

この行は 'connect(cal、SIGNAL(calendarExceptionThrown(Calendar *、ExceptionType))、this、SLOT(calendarCalendarException(Calendar *、Calendar :: ExceptionType)));'です。 – Pieter

+2

SIGNALマクロとSLOTマクロの両方でCalendar :: ExceptionTypeを使用する必要があります。また、信号とスロットの宣言にその信号がどのように含まれているかを確認する必要があります。 Qtの弱点です。シグナル/スロットシグネチャの文字列を使用するため、スコープの解決に問題があります。 –

答えて

2

接続のSIGNAL部分のExceptionTypeをCalendar :: ExceptionTypeに変更するだけで問題は解決します。 mocは、SIGNALとSLOTの両方の文字列が一致することを期待しています。

+0

上記のDanのコメント(回答を投稿するまで表示されませんでした)は、私がやったよりも少し良いことを説明しています。 – kenrogers

0

信号とスロットの宣言と、SIGNALSLOTのマクロに入れたものとは非常に一致する必要があります。 mocは完全なC++コンパイラではなく、比較的スマートなパーサです。しかし、結局のところ、シグナルとスロットの名前は単なる文字列です。例えば

、この "作品":

#include <QtCore> 

class A: public QObject { 
    Q_OBJECT 

    public: 
     enum MyEnum { e0 }; 

    public: 
     A(QObject *parent=0): QObject(parent) { 
      connect(this, SIGNAL(fire(A::MyEnum)), this, SLOT(foo(A::MyEnum))); 
     } 

    public slots: 
     void foo(A::MyEnum) { 
      qDebug() << "In slot A::foo()"; 
     } 
    signals: 
     void fire(A::MyEnum); 
    public: 
     void test() { emit fire(e0); } 
}; 

あなたはMyEnumためすべてA::修飾子を削除する場合それはまた働くだろう。しかし、あなたがいくつかを残して、他のものを取り除くなら、それは失敗するでしょう。
これらの信号/スロットをクラス外で可視/アクセス可能にする必要がある場合は、すべての名前を修飾してください。

関連する問題