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

2番目の質問は、ここでQ_OBJECTマクロを省略した場合、悪いことが起こりますか?

はい、QGraphicsSceneを「ビュー」と呼ぶのはばかげていることを私は知っています。

4

2 に答える 2

7

Q_OBJECTこの種のエラーは通常、マクロを追加して再実行するのを忘れたときに発生しますmoc。を使用する場合は、マクロを追加したqmake直後に実行してください。make qmake

Q_OBJECT2番目の質問については、マクロなしでは(とりわけ)シグナル/スロットを使用することはできません。詳細については、ドキュメントを参照してください。

于 2010-08-31T08:50:27.707 に答える
1

QDeviceWatcher最近、Linuxでコンパイルしようとしましたが、同じエラーWRTQDeviceWatcherPrivateクラスが発生します。この宣言は、 (Linuxqdevicewatcher_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メタオブジェクトコンパイラを実行し、ベースとマクロのファイル名(拡張子なし)がのファイル名(単なる仮定)と#include一致しない依存関係を除いて、すべてのソースを調べていると思います。そして、私はそれに対してMOCを調べて実行するのを逃したと思います。*.cppQObject/QWidget/...Q_OBJECTcmakeqdevicewatcher_p.h

ソースのリストに「qdevicewatcher_p.h」を追加した後、エラーは存在しなくなりました。

于 2017-06-22T19:40:45.107 に答える