Qt插槽未调用

时间:2012-07-30 13:11:28

标签: qt signals-slots

我正试图以这种方式连接信号:

QObject::connect(myObj, SIGNAL(mySignal(std::list<MyClass*> myList)), this, SLOT(mySlot(std::list<MyClass*> myList)));

未调用插槽。那是错的吗?我可以在std::list对中使用signal/slot吗?

编辑:不带参数的同一对

class TestThread : public QThread
{
    Q_OBJECT

public:
    .....
    protected:
     virtual void run();

private:
    std::list<MyClass*> myList;

signals:
    void mySignal(std::list<MyClass*>&);



};
Q_DECLARE_METATYPE (std::list<MyClass*>)

编辑:

void mySlot(const std::list<MyClass*> &);

void 
MyManager::mySlot(const std::list<MyClass*> &theList)
{
    std::cout << "mySlot " << std::endl;
}

void mySignal(const std::list<MyClass*> &theList);

TestThread ::TestThread (std::list<MyClass*>&theList, QObject *parent)
    :  QThread(parent),  myList(theList)
{


}



void
TestThread ::run() 
{
   ...
   emit mySignal(myList);
}

最后:

QObject::connect(threadObj, SIGNAL(mySignal(std::list<MyClass*>)), this, SLOT(mySlot(std::list<MyClass*>)));

3 个答案:

答案 0 :(得分:5)

如果信号发射对象和接收对象位于不同的线程中,则必须在使用qRegisterMetaType 之前注册元类型,然后才能在发射中使用它。在你的情况下:

qRegisterMetaType<std::list< MyClass* > >("std::list<MyClass*>");

应用程序启动时的某个地方应该这样做。

答案 1 :(得分:3)

您只需要类型,而不是变量的实际名称。

QObject::connect(myObj, SIGNAL(mySignal(std::list<MyClass*>)), this, SLOT(mySlot(std::list<MyClass*>)));

如果您尝试发送int,则可以使用

SIGNAL(mySignal(int))

SIGNAL(mySignal(int x))

编辑:正如@Chris指出的那样,const&不匹配不应该有所作为。

下面的代码正确地发出信号并在另一个线程中接收它。如果您不使用qRegisterMetaType,则会收到运行时警告消息,告知您这样做。

class A
{
public:
    A(): i(1) {}
    int i;
};

class T : public QThread
{
    Q_OBJECT
public:
    void run()
    {
       emit mySignal(myList);
    }

    std::list<A*> myList;

signals:
    void mySignal(const std::list<A*>&);
};

Q_DECLARE_METATYPE (std::list<A*>)
class Test: public QDialog
{   
    Q_OBJECT//this macro flags the class for the moc tool

public:
    Test()
    {
       qRegisterMetaType<std::list< A* > >("std::list<A*>");

       t = new T;
       connect(t, SIGNAL(mySignal(std::list<A*>)), this, SLOT(mySlot(std::list<A*>)));
       printf("after connect\n");

       t->start();
    }

public slots:
    void mySlot(const std::list<A*>& list){printf("mySlot");}

protected:
    T* t;
};

答案 2 :(得分:0)

如果您派生自QObject,请将Q_OBJECT宏添加到类标题中,并确保所涉及的信号和插槽具有正确的访问修饰符(即public slots) - 然后这可能意味着您需要添加:

#include <QMetaType>
Q_DECLARE_METATYPE( std::list<MyClass*> );