1

Qt を使用して GUI アプリケーションを作成しています。hello world私はQt を使用しようとしましたが、完全に動作しますが、カスタム リスト ウィジェットを作成undefined reference to vtableすると、コンパイル時にエラーが発生します。

私はEclipseとC ++を使用しています

#ifndef QMENUFILTER_H_
#define QMENUFILTER_H_
#include <qmenu.h>
class CustomMenuFilter : QMenu
{
    Q_OBJECT
public:
    CustomMenuFilter () ;
    ~CustomMenuFilter() ;
private:
    QMenu FilterMenu;
    QAction *AddFilterAct ;
    QAction *DeleteFilterAct ;

     Q_SLOT
      void contextMenuEvent(QContextMenuEvent *event);
};
#endif /* QMENUFILTER_H_ */


#include "QMenuFilter.h"
CustomMenuFilter::CustomMenuFilter():QMenu()
{
    DeleteFilterAct = new QAction("DeleteFilter" , this);
    AddFilterAct = new QAction("AddFilter" , this);
    AddFilterAct->setText("AddFilter");
    DeleteFilterAct->setText("DeleteFilter");
}

ログファイル: http://pastebin.com/raw.php?i=qZes6bkm

4

4 に答える 4

5

dtorも定義する必要があります。これにより、vtableが作成されます。

CustomMenuFilter::~CustomMenuFilter() { ... }

コンパイラがいつvtableを発行するかを正確に説明する(コンパイラに依存する)ルールがいくつかありますが、通常、知っておく必要はありません。重要なことは、dtorを定義する必要があり、コンパイラがvtableを処理することです。したがって、「vtableへの未定義の参照」というエラーが表示された場合は、常にdtorを確認してください。

于 2013-03-09T10:54:58.190 に答える
2

いくつかのコンパイラは、仮想の最初の行外定義を定義するTUでvtableを発行します。暗黙的に、この場合はデストラクタです(QMenuのデストラクタは仮想である可能性が高いため)。

したがって、デストラクタの定義を追加すると修正されるはずです。

// CustomMenuFilter.cpp

CustomMenuFilter::~CustomMenuFilter() {}
于 2013-03-09T10:55:12.530 に答える
1

#qt ファクトイドから、QObject 派生クラスで vtable エラーが発生した場合:

  1. Q_OBJECTすべての QObject 派生クラスの定義にマクロが存在することを確認してください。
  2. ヘッダー ファイルのみで QObject 派生クラスを宣言していることを確認してください。
  3. リスト内の .pro ファイルにすべてのヘッダー ファイルがリストされていることを確認しますHEADERS
  4. Q_OBJECTクラスの 1 つに追加したり、.pro ファイルを変更したりするたびに、qmake を実行します。

ビルド ログの最終的な実行可能ファイルにリンクされている moc の出力が表示されません。

g++ -L/usr/local/lib/ -lQtGui -lQtCore -o "CameraManagerAfterBeta" ./trunk/Source/Camera.o ./trunk/Source/Interface.o ./trunk/Source/Manager.o ./trunk/ Source/QMenuFilter.o ./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc

moc_QMenuFilter.o がリンクされていません。これがエラーです。Q_OBJECTマクロを追加し、qmake を再実行するのを忘れた可能性があります(またはHEADERS、.pro ファイルのリストにヘッダーを追加していません)。

于 2013-03-09T13:12:24.677 に答える