3

我用 PyQt 制作了一个项目的原型并让它在那里工作,现在我正在尝试将它转换为 C++ 并且遇到了一些问题。

如果我不放入 Q_OBJECT 宏,它会编译并工作,但如果我将其注释掉,我会收到以下错误:

Undefined symbols:
  "vtable for MapView", referenced from:
      MapView::~MapView()in mapview.o
      MapView::~MapView()in mapview.o
      MapView::MapView(QObject*)in mapview.o
      MapView::MapView()in mapview.o
  "MapView::staticMetaObject", referenced from:
      MapView::MapView(QObject*)in mapview.o
      MapView::MapView()in mapview.o

这是标题:

#ifndef MAPVIEW_H
#define MAPVIEW_H

#include <QtGui>
#include <QObject>

class MapView : public QGraphicsScene
{
    //Q_OBJECT

public:
    MapView();
    explicit MapView(QObject *parent = 0);
    QGraphicsPixmapItem *mappixmap;
    ~MapView();

private:
    bool dragging;
    float offsetX, offsetY, downoffsetX, downoffsetY;

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

#endif // MAPVIEW_H

第二个问题是如果我在这里省略 Q_OBJECT 宏会发生坏事吗?

是的,我知道将 QGraphicsScene 称为“视图”是愚蠢的。

4

2 回答 2

7

这种错误通常发生在您添加Q_OBJECT宏而忘记重新运行时moc。如果您使用qmake,只需make qmake在添加宏后运行。

Q_OBJECT至于您的第二个问题:没有宏,您将无法使用信号/插槽(除其他外) 。有关这方面的更多信息,请参阅文档

于 2010-08-31T08:50:27.707 回答
1

最近我尝试QDeviceWatcherLinux上编译,我得到了相同的错误 WRT类,可以在(在LinuxQDeviceWatcherPrivate上)中找到该声明qdevicewatcher_p.h和定义。qdevicewatcher_linux.cpp

我使用cmake作为构建系统,我CMakeLists.txt看起来像:

cmake_minimum_required(VERSION 3.8)

project("QDeviceWatcher" LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)

find_package(Qt5 REQUIRED COMPONENTS Core Network)

set(SOURCES)
list(APPEND SOURCES "qdevicewatcher.cpp")
if(WINCE)
    list(APPEND SOURCES "qdevicewatcher_wince.cpp")
elseif(WIN32)
    list(APPEND SOURCES "qdevicewatcher_win32.cpp")
elseif(APPLE)
    list(APPEND SOURCES "qdevicewatcher_mac.cpp")
elseif(UNIX)
    list(APPEND SOURCES "qdevicewatcher_linux.cpp")
else()
    message(FATAL_ERROR "no supported platform detected")
endif()

add_library(${PROJECT_NAME} STATIC ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ".")

target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Core Qt5::Network)

set_target_properties(${PROJECT_NAME} PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED YES
    CXX_EXTENSIONS YES
    )

正如您在add_library我只提供*.cpp文件中看到的那样。我怀疑,cmake运行Meta 对象编译器并查看所有源,可能除了依赖项之外,对于基础和宏#include,哪些文件名(不带扩展名)不匹配*.cpp的文件名(只是假设) 。我认为错过了查看并针对它运行MOC 。QObject/QWidget/...Q_OBJECTcmakeqdevicewatcher_p.h

在我将“qdevicewatcher_p.h”添加到源列表后,错误不再存在。

于 2017-06-22T19:40:45.107 回答