[QT]如何自定义信号?

时间:2022-01-21 04:20:08
//myThread.h
#ifndef MYTHREAD_H_
#define MYTHREAD_H_

#include <QtCore>
#include <QThread>

class myThread: public QThread {
public:
myThread();
~myThread();
public:
virtual void run();
signals:
void sigTest();
public slots:
void slotTest();
};

//myThread.cpp
#include "myThread.h"

myThread::myThread() {
connect(this, SIGNAL(sigTest()), this, SLOT(slotTest()));
}
myThread::~myThread() {

}
void myThread::run() {
emit sigTest();
}

void myThread::slotTest() {

}

//main.cpp
#include <QtCore>
#include <QApplication>
#include <QThread>
#include "myThread.h"

int main(int argc, char **argv) {
QApplication a(argc, argv);
myThread thread;
thread.start();
return a.exec();
}

我使用了上面三个文件测试一下QT的自定义信号,但是出现了如下问题:
1、error:myThread.cpp:17: undefined reference to `myThread::sigTest()'
2、如果在myThread.h里加上 Q_OBJECT,就会出现错误:
    myThread.cpp:13: undefined reference to `vtable for myThread'


请问一下这种定义信号的方法对吗?应该如何定义?
第2个错误的原因是什么?

7 个解决方案

#1


#ifndef MYTHREAD_H_ 
#define MYTHREAD_H_ 

#include <QtCore> 
#include <QThread> 

class myThread: public QThread { 
Q_OBJECT
public: 
myThread(); 
myThread(); 
public: 
virtual void run(); 
signals: 
void sigTest(); 
public slots: 
void slotTest(); 
}; 

#endif

#2


QT文档里说
Q_OBJECT
The Q_OBJECT macro must appear in the private section of a class definition 
that declares its own signals and slots or that uses other services provided 
by Qt's meta-object system.

#3


引用 2 楼 do_fork 的回复:
QT文档里说
PHP codeQ_OBJECT
The Q_OBJECT macro must appear in theprivate section of aclass definition 
that declares its own signals and slots or that uses other services provided 
by Qt's meta-object system.



你好,我加了Q_OBJECT后就出现第二种错误:myThread.cpp:13: undefined reference to `vtable for myThread' 

请问一些这是什么原因?是QT编译器的bug吗?

#4



class Server;
class Thread : public QThread
{
Q_OBJECT

public:
Thread(int iSocketDesc);

~Thread();
private:
Connection *m_pconn;
int m_isocket;
//QTcpSocket *m_pconn;

signals:
void started();

protected:
void run();

public slots:
void threadEnd();
/*void aaa();*/
};

#endif // THREAD_H


这个是我的代码,没有问题的

#5


你用qmake了吗,QT程序不是标准C++程序,
要经过MOC编译后,才能使用C++编译器编译。

除了第一段代码缺少Q_OBJECT和#endif之外,
没有别的语言上的错误了,我编译通过,也能执行。

#6


谢谢谢谢,我已经解决了。

1、要添加Q_OBJECT;
2、出现undefined reference to `vtable for myThread' 的原因是由于信号命名发生冲突。

#7


添加Q_OBJECT;
修改同名的slots和signals;
重新运行qmake;

#1


#ifndef MYTHREAD_H_ 
#define MYTHREAD_H_ 

#include <QtCore> 
#include <QThread> 

class myThread: public QThread { 
Q_OBJECT
public: 
myThread(); 
myThread(); 
public: 
virtual void run(); 
signals: 
void sigTest(); 
public slots: 
void slotTest(); 
}; 

#endif

#2


QT文档里说
Q_OBJECT
The Q_OBJECT macro must appear in the private section of a class definition 
that declares its own signals and slots or that uses other services provided 
by Qt's meta-object system.

#3


引用 2 楼 do_fork 的回复:
QT文档里说
PHP codeQ_OBJECT
The Q_OBJECT macro must appear in theprivate section of aclass definition 
that declares its own signals and slots or that uses other services provided 
by Qt's meta-object system.



你好,我加了Q_OBJECT后就出现第二种错误:myThread.cpp:13: undefined reference to `vtable for myThread' 

请问一些这是什么原因?是QT编译器的bug吗?

#4



class Server;
class Thread : public QThread
{
Q_OBJECT

public:
Thread(int iSocketDesc);

~Thread();
private:
Connection *m_pconn;
int m_isocket;
//QTcpSocket *m_pconn;

signals:
void started();

protected:
void run();

public slots:
void threadEnd();
/*void aaa();*/
};

#endif // THREAD_H


这个是我的代码,没有问题的

#5


你用qmake了吗,QT程序不是标准C++程序,
要经过MOC编译后,才能使用C++编译器编译。

除了第一段代码缺少Q_OBJECT和#endif之外,
没有别的语言上的错误了,我编译通过,也能执行。

#6


谢谢谢谢,我已经解决了。

1、要添加Q_OBJECT;
2、出现undefined reference to `vtable for myThread' 的原因是由于信号命名发生冲突。

#7


添加Q_OBJECT;
修改同名的slots和signals;
重新运行qmake;