[Qt-interest] Register metatype in multiple namespaces

Jean-Olivier Racine joracine at humancad.com
Wed Jun 10 19:22:31 CEST 2009


Hi there,

I am trying to connect two objects which are in different namespaces 
with a signal/slot which take Q_FLAGS as an argument. But it seems the 
MOC gets things all confused... Whatever I try, I can't seem to get that 
connection working.

Here`s a minimal example to reproduce the problem.

_*Include file*_:
namespace Test
{
    class MyClass : public QObject
    {
        Q_OBJECT;
        Q_FLAGS(MyFlags);

    public:
        enum MyFlag
        {
            Flag01 = 0x01,
            Flag02 = 0x02
        };
        Q_DECLARE_FLAGS(MyFlags, MyFlag);

        void Go()
        {
            emit MySignal(Flag01);
        }

signals:
        void MySignal(MyFlags f);
    };
}
Q_DECLARE_OPERATORS_FOR_FLAGS(Test::MyClass::MyFlags);
Q_DECLARE_METATYPE(Test::MyClass::MyFlags);

class MySlotClass : public QObject
{
    Q_OBJECT;

    public slots:
        void MySlot(Test::MyClass::MyFlags f)
        {
            qDebug("MySlot");
        }
};

_*Source file*_:

int TypeID = qRegisterMetaType<Test::MyClass::MyFlags>("MyFlags");

int main(int argc, char *argv[])
{
    QApplication App(argc, argv);

    Test::MyClass A;
    MySlotClass B;

    // The below 4 connects fail
    // --------------------------

    // Object::connect: No such slot MySlotClass::MySlot(MyFlags) in 
..\..\src\main.cpp:56
    QObject::connect(&A, SIGNAL(MySignal(MyFlags)), &B, 
SLOT(MySlot(MyFlags)));

    // QObject::connect: Incompatible sender/receiver arguments

    // Test::MyClass::MySignal(MyFlags) --> 
MySlotClass::MySlot(Test::MyClass::MyFlags)

    QObject::connect(&A, SIGNAL(MySignal(MyFlags)), &B, 
SLOT(MySlot(Test::MyClass::MyFlags)));

    // Object::connect: No such signal 
Test::MyClass::MySignal(Test::MyClass::MyFlags) in ..\..\src\main.cpp:58
    QObject::connect(&A, SIGNAL(MySignal(Test::MyClass::MyFlags)), &B, 
SLOT(MySlot(MyFlags)));

    // Object::connect: No such signal 
Test::MyClass::MySignal(Test::MyClass::MyFlags) in ..\..\src\main.cpp:59
    QObject::connect(&A, SIGNAL(MySignal(Test::MyClass::MyFlags)), &B, 
SLOT(MySlot(Test::MyClass::MyFlags)));

    A.Go();

    return(App.exec());
}

What I am missing?

Thanks!
J-O



More information about the Qt-interest-old mailing list