如何在QThread的run函数内发出信号?

时间:2014-05-12 18:50:58

标签: c++ qt signals qthread

我编写了一个简单的程序,它在QThread继承类的run函数内部发出信号,而在另一个继承QObject的类中写入了一个槽来捕获信号,但是当我编译代码时,我得到以下错误:

  

未找到架构x86_64的符号   collect2:ld返回1退出状态

这是我的代码:

class visionThread : public QThread
{
public:
    visionThread();
    void run();
signals:
    void newVisionPacket();
};

visionThread::visionThread():QThread(){
}

void visionThread::run()
{
    for(int i = 0 ; i<10 ; i++)
    {
        emit newVisionPacket();
        usleep(1000);
    }
}


class dummyClass: public QObject{
public:
    dummyClass(){
    }

    void doConnect(visionThread* v){
        connect(v , SIGNAL(newVisionPacket()) , this , SLOT(mySlot()));
    }
public slots:
    void mySlot(){
        usleep(2000);
        qDebug() << "HI" << endl;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    visionThread *vision;

    vision = new visionThread();

    dummyClass *dummyObject = new dummyClass();

    dummyObject->doConnect(vision);

    vision->start(QThread::NormalPriority);

    return a.exec();
}

我很困惑,我会非常感谢任何解决方案。

1 个答案:

答案 0 :(得分:4)

你没有在你的课程中放置Q_OBJECT宏。它应该是:

class visionThread : public QThread
{
    Q_OBJECT
public:
    visionThread();
    void run();
signals:
    void newVisionPacket();
};

class dummyClass: public QObject{
    Q_OBJECT
public:
    dummyClass(){
    }

    void doConnect(visionThread* v){
        connect(v , SIGNAL(newVisionPacket()) , this , SLOT(mySlot()));
    }
public slots:
    void mySlot(){
        usleep(2000);
        qDebug() << "HI" << endl;
    }
};

添加Q_OBJECT宏后清理项目,运行qmake并重建它。