没有什么可以帮助解决 Qt 中的“对 vtable 的未定义引用”

2024-04-19

我无法构建此错误“未定义对 CustomUndoStack 的 vtable 的引用”

这是代码:

class CustomUndoStack : public QObject
{
    Q_OBJECT

public:

};


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

    CustomUndoStack uStack;

    return qCoreApplication.exec();
}

这是 .pro 文件:

QT += widgets

CONFIG += c++14 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp

我已经手动删除了构建目录,我已经以所有可能的方式尝试了“全部清理”和“重新构建全部”,我已经运行了 qmake 100500 次,我已经更改了 CustomUndoStack 界面超过 9000 次,但没有任何帮助。

问题出在哪里?

UPD回答评论:如果我删除 Q_OBJECT 行,那么我就不能这样做。它说“没有这样的信号 QObject::undoSignal()”

class CustomUndoStack : public QObject
{
//    Q_OBJECT

public:
    CustomUndoStack() {
        connect(this, SIGNAL(undo_signal()), &undoStack, SLOT(undo()));
    }
signals:
    void undo_signal();
private:
    QUndoStack undoStack;
};

您的问题是由于您声明了类子类化而引起的QObject并拥有Q_OBJECT里面的宏.cpp文件;该宏除其他内容外还包含虚拟方法的声明:

virtual const QMetaObject *metaObject() const;

qmake工具只处理头文件来定位QObject子类包含Q_OBJECT宏自动生成与生成的声明相对应的实际代码Q_OBJECT宏。就你而言,qmake不处理main.cpp文件,因此它包含未实现的虚拟函数 - 因此您收到链接器错误。

正确的解决方案是将类的声明移动到单独的头文件中,并将该头添加到您的项目中。然而,还有另一种解决方案,虽然有点 hacky,但如果您出于某种原因绝对需要将类的声明留在.cpp file:

class CustomUndoStack : public QObject
{
    Q_OBJECT
public:
    CustomUndoStack(QObject * parent = 0) : QObject(parent) {}
};

#include "main.moc"

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

    CustomUndoStack uStack;

    return qCoreApplication.exec();
}

注意#include "main.moc"线。这条线力量的存在qmake实际处理您的声明.cpp文件并生成所需的.moc文件,其中包含与生成的声明相对应的自动生成的代码Q_OBJECT macro.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有什么可以帮助解决 Qt 中的“对 vtable 的未定义引用” 的相关文章

  • Qt 调试器在 mac 上使用错误的 python 版本

    我使用的是 macOS Mojave 10 14 6 我的Qt版本是5 13 1 我的 Qt Creator 版本是 4 10 0 当我设置断点并运行应用程序时 调试器永远不会完成并打印到调试器日志并显示以下错误 因此 据我所知 lldb
  • 故障转储分析:CxxUnhandledExceptionFilter

    我有一个崩溃小型转储需要分析 我的程序是多线程Qt5应用程序 我不是调试专家 但通常我可以轻松找到程序失败的地方 但这次我不能 我在 Visual Studio 2010 中打开转储文件 单击 仅使用本机调试 它向我显示问题所在 它是位置为
  • 如何在“单击”槽中使用 QApplication::mouseButtons() 来判断鼠标按钮?

    我有一个 QMainWindow 并且想要处理来自其中较小的小部件 例如 tableview 的 单击 信号 最初我将信号连接到这个 QMainWindow 的插槽 这是最常见的方法 现在我需要判断单击了哪个鼠标按钮 并对左右按钮执行不同的
  • 如何使用 qt 在键盘上仅显示数字

    我在我的项目中使用 Qt Quick Virtual Keyboard 当我单击一个对象时 我想显示键盘但只显示数字 我怎样才能做到这一点 这就是我想做的 您可以使用Qt ImhFormattedNumbersOnly http doc q
  • 部署 Qt Quick 演示应用程序 Minehunt 时出现全白屏幕

    为了测试部署过程 我尝试部署附带的演示应用程序 Minehunt 我能够让它运行 没有崩溃或错误 但屏幕是全白的 我相信这通常意味着我缺少插件 Dependency walker 报告没有问题 我什至尝试包含 Qt MingW 插件目录中的
  • Qt 中浮点数的强制点而不是逗号

    我有一个非常基本的问题 如何在 Qt 中强制使用浮点数中的点而不是逗号 我的操作系统有法语版本 其他问题 是否可以显示带有千位分隔符空格的数字 尝试这个 QLocale loc QLocale system current locale l
  • 为什么 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget

    我需要像范围滑块 具有两个用于设置最小 最大值的手柄的滑块 之类的东西 我注意到有一个RangeSlider在 QtQuick 和 QML 无论是什么 中 但没有 标准小部件 例如QRangeSlider 为什么是这样 我可以用那个吗Ran
  • 为树视图创建 Qt 模型

    我正在用 Qt 使用 C 编写一个应用程序 我需要在树视图中表示一个对象结构 实现此目的的方法之一是为此创建一个模型 但在阅读有关该主题的 Qt 文档后我仍然很困惑 我的 结构 非常简单 有一个Project持有的物体Task中的对象std
  • Qt for Android:无法签署应用程序的发布版本

    我正在使用 Qt 5 13 和 Qt Creator 4 9 2 我可以成功构建 Android 应用程序的调试版本 但是当我尝试编译发布版本时 我得到 16 57 35 过程 opt Qt 5 13 0 android armv7 bin
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • QGeoCoordinate:没有这样的文件或目录

    我正在尝试使用 QtLocation 但不能 我不明白为什么 我在 ubuntu 14 04 上使用 qt5 3 2 这很奇怪 因为我将这一行添加到我的 pro 文件中 QT network CONFIG mobility MOBILITY
  • 如何在QLineEdit/QLabel等中从左到右显示阿拉伯符号?

    在Qt的实现中阿拉伯符号显示在右到左方向 因此任何包含阿拉伯符号的字符串都将右对齐 但我的应用程序想要做的是显示所有文本左到右方向 无论是否包含阿拉伯符号 所有文本都是左对齐的 一个例子如下所示 This is 我想实现什么 就是这样QLi
  • 由于 QCoreApplication 事件循环,QThread 永远不会退出

    Problem 所以我有一个 CommandRetriever 类来保存一些命令 并且should在不同的线程上执行这些命令 class CommandRetriever public CommandRetriever CommandRet
  • QMetaObject::invokeMethod 在以下情况下不起作用:

    从静态类和非主线程调用 简而言之 我有一个类 sapp 它有另一个静态类 tobj 作为静态成员 为了避免静态顺序初始化失败 tobj 在 sapp 的方法中声明 该方法又返回 tobj 实例的指针 我的问题是 tobj 有一个计时器 应该
  • App Store 上是否允许嵌入 dylib 的 iOS 8 应用程序?

    iOS 8 现在支持动态框架 是否意味着 App Store 提交允许这样做 似乎以前的开发人员能够在内部应用程序中使用 dylib 但在提交到 App Store 的内容中使用它们会导致您被拒绝 情况仍然如此 还是 iOS 8 中的这一更
  • 使用 KDE Kirigami 时未找到 QML 模块

    所以我决定在我的应用程序中使用 KDE Kirigami UI 框架 所以我按照说明进行操作here https api kde org frameworks kirigami html index html 我将存储库克隆到我的应用程序目
  • 在QT中以不同的时间间隔更新GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何在QT中以不同的时间间隔更新GUI 最好的是我可以控制时间间隔 我知道 QTimer 可以在同一时间间隔更新 GUI 但我
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • Qt QML ComboBox 覆盖滚轮事件

    有没有办法覆盖 ComboBox MouseArea 以忽略滚轮事件而不是更改当前索引 ComboBox 本身没有选项可以更改滚轮焦点行为 到目前为止 我尝试使用如下代码覆盖 CB MouseArea 的 onWheel ComboBox
  • 如何在Qt WebKit中将网页保存为“另存为完整网页”

    我需要使用 Qt WebKit 保存网页 类似于 另存为完整网页 以下是我的要求 保存索引html文件 维护实体编码 需要下载所有链接的图像和其他资源 需要将html页面中的资源路径更改为本地下载路径 需要维护网页当前状态 我可以使用 Qt

随机推荐