2012-01-03 24 views
1

Qtの例をコンパイルする際に問題が発生しましたqt 4秒版のC++ GUIプログラミング book on visual C++ express 2010.Since qt visual studio add-inが動作しませんExpress版では、ライブラリの依存関係を追加するだけで、自分で設定しました。qtmaind.lib QtCored4.lib QtGuid4.lib。また、サンプルコード「Hello、Qt!」をコンパイルできます。間違いなく。
findDialog.h:Visual StudioでQtの例をコンパイル中にリンクエラーが発生する

#ifndef FINDDIALOG_H 
#define FINDDIALOG_H 

#include <QtGui\qdialog.h> 
class QCheckBox; 
class QLabel; 
class QLineEdit; 
class QPushButton; 

class findDialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    findDialog(QWidget* parent = 0); 
signals: 
    void findNext(const QString &str , Qt::CaseSensitivity cs); 
    void findPrevious(const QString &str , Qt::CaseSensitivity cs); 
private slots: 
    void findClicked(); 
    void enableFindButton(const QString& text); 
private: 
    QLabel* label; 
    QLineEdit* lineEdit; 
    QCheckBox* caseCheckBox; 
    QCheckBox* backwardCheckBox; 
    QPushButton* findButton; 
    QPushButton* closeButton; 
}; 
#endif 

findDialog.cpp:

#include <QtGui\QtGui> 
#include "findDialog.h" 


findDialog::findDialog(QWidget* parent) : QDialog(parent) 
{ 
    label = new QLabel(tr("Find &what:")); 
    lineEdit = new QLineEdit; 
    label->setBuddy(lineEdit); 

    caseCheckBox = new QCheckBox(tr("Match &case")); 
    backwardCheckBox = new QCheckBox(tr("Search &backward")); 

    findButton = new QPushButton(tr("&Find")); 
    findButton->setDefault(true); 
    findButton->setEnabled(false); 

    closeButton = new QPushButton(tr("Close")); 

    connect(lineEdit , SIGNAL(textChanged(const QString&)) , this , SLOT(enableFindButton(const QString&))); 
    connect(findButton , SIGNAL(clicked()) , this , SLOT(findClicked())); 
    connect(closeButton , SIGNAL(clicked()) , this , SLOT(close())); 

    QHBoxLayout* topLeftLayout = new QHBoxLayout; 
    topLeftLayout->addWidget(label); 
    topLeftLayout->addWidget(lineEdit); 

    QVBoxLayout *leftLayout = new QVBoxLayout; 
    leftLayout->addLayout(topLeftLayout); 
    leftLayout->addWidget(caseCheckBox); 
    leftLayout->addWidget(backwardCheckBox); 

    QVBoxLayout *rightLayout = new QVBoxLayout; 
    rightLayout->addWidget(findButton); 
    rightLayout->addWidget(closeButton); 
    rightLayout->addStretch(); 

    QHBoxLayout *mainLayout = new QHBoxLayout; 
    mainLayout->addLayout(leftLayout); 
    mainLayout->addLayout(rightLayout); 
    setLayout(mainLayout); 

    setWindowTitle(tr("Find")); 
    setFixedHeight(sizeHint().height()); 
} 

void findDialog::findClicked() 
{ 
    QString text = lineEdit->text(); 
    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive; 

    if(backwardCheckBox->isChecked()) 
     emit findPrevious(text , cs); 
    else 
     emit findNext(text , cs); 
} 

void findDialog::enableFindButton(const QString& text) 
{ 
    findButton->setEnabled(!text.isEmpty()); 
} 

main.cppに:

#include <QtGui\qapplication.h> 
#include <iostream> 
#include "findDialog.h" 



int main(int argc , char* argv[]) 
{ 
    QApplication app(argc , argv); 
    findDialog* dialog = new findDialog; 
    dialog->show(); 
    return app.exec(); 
} 

I 私のプロジェクトには、2つの.cppファイルとヘッダファイルが含まれていますこのプロジェクトをコンパイルすると、6つのリンクエラーが発生します。

LNK2001:未解決の外部シンボル "パブリック:仮想構造体QMetaObjectのCONST * __thiscall findDialog ::メタオブジェクト(無効)constは、"(メタオブジェクト@ findDialog @@ UBEPBUQMetaObject @@ XZ?)

LNK2001:未解決の外部シンボル「パブリック:仮想無効* __thiscall findDialog :: qt_metacast(char型のconst *) "(qt_metacast @ findDialog @@ UAEPAXPBD @ Z?)

LNK2001:未解決の外部シンボル" パブリック:仮想int型__thiscall findDialog :: qt_metacall(列挙QMetaObject ::コール、int型ボイド* *)」?(qt_metacall @ findDialog @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z)

LNK2001:未解決の外部シンボル "パブリック:?静的構造体QMetaObjectのconstのfindDialog :: staticMetaObject"(staticM etaObject @ findDialog @@ 2UQMetaObject @@ B)

LNK2019:未解決の外部シンボル? "保護:無効__thiscall findDialog ::のfindNext(クラスQStringののconstの&、列挙型はQt :: CaseSensitivity)"(のfindNext @ findDialog @@ IAEXABVQString @ @ W4CaseSensitivity Qtの機能の中で参照@@@ Z)@ "プライベート:無効__thiscall findDialog :: findClicked(無効)"(findClicked @ findDialog @@ AAEXXZ)

LNK2019:未解決の外部シンボル「保護されます。void __thiscall findDialog:関数 "private:void __thiscall findDialog :: findClicked(void)"で参照されるfindPrevious(クラスQString const &、列挙型Qt :: CaseSensitivity) "(findPrevious @ findDialog @@ IAEXABVQString @@ W4CaseSensitivity @ Qt @@@ Z) ?findClicked @ findDialog @@ AAEXXZ)

ありがとう、私の悪い英語のために申し訳ありません。

+1

moc_findDialog.cppを生成しましたか? – werewindle

+0

No.必要ですか? –

答えて

1

おそらく、あなたは、起亜に基づいて多くの仕事であなたの問題を解決することができます。

しかし、すべてこの作業

  • fairly typical posting in QT forum (summary: expect problems)a claim of success
  • one source (1) is based on

    1. からceleverの診断と更なる情報は一般的な、C++、またはQTであなたの知識/スキルWRTプログラミングを促進しません。 Visual Studioが重要な場合は、無制限のバージョンでプロフェッショナル向けに投資し、アドインをインストールして、それが意味するものではないツールを構成するという面倒を避けてください。それ以外の場合は、QT-Creatorをインストールしてください((2)、Qt Creator IDE and tools参照)。

  • 1

    リンクエラーの原因はQt's Meta Object Compilerです。
    Q_OBJECTマクロをクラスに書くだけで、イベントを処理するためにQtが必要とするクラス内のいくつかのメンバ関数が定義されています。
    Qt MOCは新しい.cppファイルを作成し、 。
    FindDilog(moc_FindDialog.cpp)の特定の.cppファイルがリンクエラーで明白に表示されます。つまり、mocファイルはQtによって生成されません。
    Visual StudioでQt Mocを呼び出して.cppファイルを生成することを忘れた可能性があります。おそらくVisual Studioコンパイラがコンパイルしていないかもしれません...

    +0

    解決策は何ですか? –

    +0

    Visual Studioプロジェクトを再作成してください! –

    1

    あなたはQtインテグレーションを持っていないので、自分のQtプロジェクトの1つに設定をチェックしました。

    propertyページのFindDialog.hの場合、Item TypeC/C++ headerからに変更してください。 Applyを押すと、新しいCustom Build Toolアイテムが左側に表示されます。それを展開し、GeneralにあなたがCommand Lineを見つけるだろう、これはリリースビルドのための私のコマンドラインです

    "$(QTDIR)\bin\moc.exe" -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" ".\FindDialog.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" 
    

    を入力してください。設定に応じて変更する必要があります。生成されたcppをプロジェクトに追加してください。 Custom Build Toolの下

    、項目があります以下は、VCのプロジェクトファイルで、このファイルのセクションで、私はまだ何かが欠けされるように

    ".\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp" 
    

    であるべき、Outputsと呼ばれる:

     <File 
          RelativePath=".\FindDialog.h" 
          > 
          <FileConfiguration 
           Name="Release|Win32" 
           > 
           <Tool 
            Name="VCCustomBuildTool" 
            Description="Moc&apos;ing FindDialog.h..." 
            CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I.&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;.\FindDialog.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;" 
            AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;.\FindDialog.h" 
            Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp&quot;" 
           /> 
          </FileConfiguration> 
          <FileConfiguration 
           Name="Debug|Win32" 
           > 
           <Tool 
            Name="VCCustomBuildTool" 
            Description="Moc&apos;ing FindDialog.h..." 
            CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I.&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;.\FindDialog.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;" 
            AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;.\FindDialog.h" 
            Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp&quot;" 
           /> 
          </FileConfiguration> 
         </File> 
    

    これはVS2008のvcprojからのものです。

    +0

    いいえそれでもリンクエラーがあります。警告: 警告MSB8018:「findDialog.h」の項目に出力が指定されていません。カスタムビルドコマンドはスキップされます。 –

    +0

    @ Arman-aegit:「.h」のセクションを答えに入れる方が良いと思います。カスタムビルドステップの下に 'Output'プロパティがあります。 – fefe

    0

    findDialog.hが.proファイルに明示的に含まれていることを確認してください。 そうでない場合は、プロジェクトをビルドする前にqmakeを再度実行してください。

    関連する問題