我使用 Empty Qt Project
创建了QTCreator的新项目MocTest.pro
QT += core
QT -= gui
TARGET = MocTest
CONFIG += console
TEMPLATE = app
SOURCES += \
main.cpp
的main.cpp
#include <QCoreApplication>
#include <iostream>
class A : public QObject
{
Q_OBJECT
public:
A() {}
public slots:
void slotA() {std::cout<<"Hi!";}
};
class B : public QObject
{
Q_OBJECT
public:
B () {}
void doB() {emit ss();}
signals:
void ss();
};
int main(int argc, char *argv[])
{
QCoreApplication app (argc, argv);
A a;
B b;
return app.exec();
}
我收到了错误
D:\ Test \ MocTest \ debug \ main.o:-1:在函数`ZN1AC1Ev'中:
D:\ Test \ MocTest \ main.cpp:9:错误:未定义引用'vtable for A'
D:\ Test \ MocTest \ main.cpp:20:错误:未定义引用'vtable for B'
D:\ Test \ MocTest \ main.cpp:4:错误:未定义引用'vtable for A'
D:\ Test \ MocTest \ main.cpp:15:错误:未定义引用'vtable for B'
collect2.exe:-1:错误:错误:ld返回1退出状态
答案 0 :(得分:2)
Qmake确保运行Moc:
看起来你需要把它放在:
#include "main.moc"
某处main.cpp
(可能在最后)。
详情请见https://qt-project.org/forums/viewthread/21420
答案 1 :(得分:0)
vtable引用由moc为类heriting QObject
生成。
这些是使用HEADERS
变量的文件生成的。
然后你必须分开标题和实现。这将给出:
myclass.h
class A : public QObject
{
Q_OBJECT
public:
A();
public slots:
void slotA();
};
class B : public QObject
{
Q_OBJECT
public:
B();
void doB();
signals:
void ss();
};
和myclass.cpp
#include "myclass.h"
A::A()
{}
void A::slotA()
{ std::coud << "Hi!; }
B::B()
{}
void B::doB
{ emit ss(); }
然后是TestMoc.pro
QT = core # default is QT = core gui, so -= gui is enough or just =core
HEADERS = myclass.h
SOURCES = myclass.cpp main.cpp
请记住,在内联方法中调用信号通常是个坏主意。 此外,如果你在main中调用doB,在app.exec()之前,它可能无法处理,因为一旦运行事件循环就会管理信号/插槽