我正试图以这种方式连接信号:
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*>)));
答案 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*> );