1

我正在尝试以这种方式连接到信号:

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*>)));
4

3 回答 3

5

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

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

在你的应用程序开始的某个地方应该这样做。

于 2012-07-30T14:02:05.303 回答
3

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

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

如果你试图发送一个int,你会使用

SIGNAL(mySignal(int))

不是

SIGNAL(mySignal(int x))

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

下面的代码正确地发出信号并在另一个线程中接收它。如果您不使用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;
};
于 2012-07-30T13:22:06.260 回答
0

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

#include <QMetaType>
Q_DECLARE_METATYPE( std::list<MyClass*> );
于 2012-07-30T13:47:53.500 回答