为什么在添加Javascript窗口对象时Vtable链接问题?

时间:2014-02-12 13:48:05

标签: javascript c++ qt

我正在尝试在QT上构建应用程序。这是应用程序。

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QWebFrame>
#include <QWebPage>
#include <QWebView>

class MyJavaScriptOperations : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE void sumOfNumbers(int a, int b) {
        qDebug() << a + b;
    }
};


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

    QWebView *view = new QWebView();
    view->resize(400, 500);
    view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", new MyJavaScriptOperations);
    //view->load(QUrl("file:///path/to/my/index.html"));
    view->show();

    return a.exec();
}

我有以下专业档案。

QT       += core gui
QT       +=  widgets
QT       += webkit

TARGET = JS_DEMO1
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

构建时出现以下错误。

(。text.startup + 0x8c): - 1:错误:未定义引用`vtable for MyJavaScriptOperations&#39;

2 个答案:

答案 0 :(得分:2)

因此,error: undefined reference to vtable的可能原因和相应的解决方案是:

  • 一个类继承了纯虚函数,但尚未覆盖它们。覆盖它们。
  • QObject's完成后,某个类已被声明为Q_OBJECT继承人并且已moc宏。再次moc
  • 标题未出现在.pro中,或者在标题中出现 Q_OBJECT之后已添加到标题中。重建项目,或者(简短的方法)更新.pro的时间戳并再次生成Build。例如,更新所有项目的时间戳的简短方法是find . -name '*.pro' -exec touch '{}' \;

后两者似乎会导致你的情况。

希望这有帮助。

答案 1 :(得分:1)

如果在头文件外使用Q_OBJECT宏,则需要添加#include "<BASENAME>.moc"。这将告诉qmake在文件上运行moc以生成QObject(信号/插槽等)的代码。

因此,在您的情况下,只需将#include "main.moc"放在main.cpp文件的末尾并重建项目。