您的位置:首页 > 编程语言 > Qt开发

Qtcreator使用中遇到的错误汇总

2015-01-26 20:48 323 查看
1. 安装完成后,只能用vs新建qt项目,下面代码才能运行,新建控制台没用

//#include "qt11.h"

#include <QtWidgets/QApplication> // Qt5.0以上,需要加上QtWidgets

#include <QtWidgets/QLabel>

int main(int argc, char *argv[])

{
QApplication a(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
//qt11 w;
//w.show();
return a.exec();

}

cmd命名中用qmake命令,qmake路径:D:\Qt\Qt5.2.0VS2010\5.2.0\msvc2010_opengl\bin,导入到path路径中即可使用

2. 用Qtcreator添加Qt设计师界面类时,用该类声明一个对象,编译有可能出现:Qtcreator中编译出现无法解析的外部符号,未找到文件:mainwindow.obj类似的错误,解决方法:删除项目目录下的release和dubug文件夹,然后清理项目,重新构建,执行qmake,参考:http://tieba.baidu.com/p/2567360449

注:执行qmake即可,再重新运行即可。

3. http://www.netfoucs.com/jcy8126/article/details/8278916
编译时,gluPerspective处如下错误:

  C:\Users\Administrator\Desktop\tornadomeet\opengl\opengl_nehe_01\glwidget.cpp:46: error: C3861: “gluPerspective”: 找不到标识符。

很多人在用QT写OpenGL程序的时候需要使用glu开头的函数,但是却发现怎么也没法使用,例如:gluPerspective函数,用来建立透视投影矩阵的。

其实不仅仅是QT,包括VC编译器,也都会出现上面的问题。

错误:

错误:C3861: 'gluPerspective': identifier not found

解决办法:

在pro文件中加入:LIBS += glut.lib glut32.lib

但是前提是你将这两个lib文件放入了qt的bin目录下,我的电脑安装的对应目录是:

C:\QtSDK\Simulator\Qt\mingw\lib

然后在你使用到相应函数中添加头文件:

#include <GL/GLU.h>

这样基本上就可以使用glu开头的函数了。

5. Qtcreator中继承QGLWidget,然后重写下列函数:

 void initializeGL();

    void paintGL();

    void resizeGL( int width, int height );

会调用一下函数:

  glShadeModel(GL_SMOOTH);

    glClearColor( 0.0, 0.0, 0.0, 0.0 );

    glClearDepth( 1.0 );

    glEnable( GL_DEPTH_TEST );

    glDepthFunc( GL_LEQUAL );

 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glLoadIdentity();

完整代码如下:

// myQtOpenglWindow.h

#ifndef MYQTOPENGLWINDOW_H

#define MYQTOPENGLWINDOW_H

#include <QtOpenGL/QtOpenGL>

#include <QtOpenGL/QGLWidget>

#include <QWidget>

class myQtOpenglWindow : public QGLWidget

{

    Q_OBJECT

public:

    explicit myQtOpenglWindow( QWidget* parent = 0, const char* name = 0, bool fs = false );\

    ~myQtOpenglWindow();

protected:

    void initializeGL();

    void paintGL();

    void resizeGL( int width, int height );

    void keyPressEvent(QKeyEvent *);

protected:

    bool fullScreen;

signals:

public slots:

};

#endif // MYQTOPENGLWINDOW_H

// myQtOpenglWindow.cpp

#include "myqtopenglwindow.h"

#include <gl/GLU.h>

myQtOpenglWindow::myQtOpenglWindow( QWidget* parent, const char* name, bool fs )

    :QGLWidget( parent )

{

     //保存窗口是否为全屏的状态。

    fullScreen = fs;

    //设置窗口的位置,即左上角为(0,0)点,大小为640*480。

    setGeometry( 0, 0, 640, 480 );

    // 设置窗口的标题为“My's OpenGL Framework”。

    //setCaption( "My's OpenGL Framework" );

    // 如果fullscreen为真,那么就全屏显示这个窗口。

    if ( fullScreen )

    {

        showFullScreen();

    }

}

myQtOpenglWindow::~myQtOpenglWindow()

{

}

void myQtOpenglWindow::initializeGL()

{

    glShadeModel(GL_SMOOTH);

    glClearColor( 0.0, 0.0, 0.0, 0.0 );

    glClearDepth( 1.0 );

    glEnable( GL_DEPTH_TEST );

    glDepthFunc( GL_LEQUAL );

    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

    return;

}

void myQtOpenglWindow::paintGL()

{

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glLoadIdentity();

    return;

}

void myQtOpenglWindow::resizeGL(int width, int height)

{

    //防止height为0

    if( height == 0 )

    {

        height =1;

    }

    //重置当前的视口(Viewport)

    glViewport( 0, 0, (GLint)width, (GLint)height );

    //选择投影矩阵。

    glMatrixMode( GL_PROJECTION );

    //重置投影矩阵

    glLoadIdentity();

    //建立透视投影矩阵

    gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );

    //gluPerspective(45.0,(GLfloat)width() / (GLfloat)height(),0.1,100.0);

    // 选择模型观察矩阵

    glMatrixMode( GL_MODELVIEW );

    // 重置模型观察矩阵。

    glLoadIdentity();

    return;

}

void myQtOpenglWindow::keyPressEvent(QKeyEvent * e)

{

    switch ( e->key() )

    {

        //如果按下了F2键,那么屏幕是否全屏的状态就切换一次。然后再根据需要,显示所要的全屏窗口或者普通窗口。

        case Qt::Key_F2:

            fullScreen = !fullScreen;

            if ( fullScreen )

            {

                showFullScreen();

            }

            else

            {

                showNormal();

                setGeometry( 0, 0, 640, 480 );

            }

            updateGL();

            break;

        //如果按下了Escape键,程序退出。

        case Qt::Key_Escape:

            close();

    }

    return;

}

使用上面代码:myQtOpenglWindow *p = new myQtOpenglWindow; p->show();即可在Qt中渲染一个opengl窗口,进行opengl编程,但可能会遇到下面错误:

运行出现下列错误:

myqtopenglwindow.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QGLWidget::~QGLWidget(void)" (__imp_??1QGLWidget@@UAE@XZ),该符号在函数 "public: virtual __thiscall myQtOpenglWindow::~myQtOpenglWindow(void)" (??1myQtOpenglWindow@@UAE@XZ)
中被引用

myqtopenglwindow.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QGLWidget::QGLWidget(class QWidget *,class QGLWidget const *,class QFlags<enum Qt::WindowType>)" (__imp_??0QGLWidget@@QAE@PAVQWidget@@PBV0@V?$QFlags@W4WindowType@Qt@@@@@Z),该符号在函数
"public: __thiscall myQtOpenglWindow::myQtOpenglWindow(class QWidget *,char const *,bool)" (??0myQtOpenglWindow@@QAE@PAVQWidget@@PBD_N@Z) 中被引用

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual bool __thiscall QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MAE_NPAVQEvent@@@Z)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::paintEvent(class QPaintEvent *)" (?paintEvent@QGLWidget@@MAEXPAVQPaintEvent@@@Z)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::resizeEvent(class QResizeEvent *)" (?resizeEvent@QGLWidget@@MAEXPAVQResizeEvent@@@Z)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall QGLWidget::updateGL(void)" (?updateGL@QGLWidget@@UAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall QGLWidget::updateOverlayGL(void)" (?updateOverlayGL@QGLWidget@@UAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::initializeOverlayGL(void)" (?initializeOverlayGL@QGLWidget@@MAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::resizeOverlayGL(int,int)" (?resizeOverlayGL@QGLWidget@@MAEXHH@Z)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::paintOverlayGL(void)" (?paintOverlayGL@QGLWidget@@MAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::glInit(void)" (?glInit@QGLWidget@@MAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __thiscall QGLWidget::glDraw(void)" (?glDraw@QGLWidget@@MAEXXZ)

myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "public: virtual class QPaintEngine * __thiscall QGLWidget::paintEngine(void)const " (?paintEngine@QGLWidget@@UBEPAVQPaintEngine@@XZ)

moc_myqtopenglwindow.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual void * __thiscall QGLWidget::qt_metacast(char const *)" (__imp_?qt_metacast@QGLWidget@@UAEPAXPBD@Z),该符号在函数 "public: virtual void * __thiscall myQtOpenglWindow::qt_metacast(char
const *)" (?qt_metacast@myQtOpenglWindow@@UAEPAXPBD@Z) 中被引用

moc_myqtopenglwindow.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual int __thiscall QGLWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (__imp_?qt_metacall@QGLWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z),该符号在函数 "public: virtual int
__thiscall myQtOpenglWindow::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@myQtOpenglWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 中被引用

moc_myqtopenglwindow.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: static struct QMetaObject const QGLWidget::staticMetaObject" (__imp_?staticMetaObject@QGLWidget@@2UQMetaObject@@B)

debug\test.exe : fatal error LNK1120: 16 个无法解析的外部命令

解决方法:

添加外部文件:QT/QT5.3.1/5.3/msvc2010_opengl/lib/Qt5OpenGL.lib,再次试一试,不行,删除debug和release文件夹,然后清理项目,然后重新构建项目,再次运行,或清理项目后,执行qmake,再次运行试试。

出现上面错误,看看是否函数只有声明没有实现。

6. Qtcreator中不能有/* */注释,否则会出现:”在注释中遇到意外的文件结束“的错误,把/* */改为//即可

7. Qtcreator中有时改了代码还是出现上一次出现的情况,执行qmake一下,重新构建试一下。

        

8. Qtcreator中#include <头文件>编译出现:打开包括文件:"gl/glaux.h" no such file or direcotry

解决方法:右击项目-》添加库-》外部库,把库文件(.lib文件)和包含路径添加进来,注意,库文件命名要为小写,且路径不要包含中文等其他不好的字符,然后重新构建项目,执行qmake,清理项目,多执行几次,开始时可能还会出现上面的错误。

执行qmake通过后,运行时可能会出现:

glaux.lib(tk.obj) : error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function _GetRegistrySysColors@8  

1>glaux.lib(tk.obj) : error LNK2019: unresolved external symbol __imp__RegQueryValueExA@24 referenced in function _GetRegistrySysColors@8  

1>glaux.lib(tk.obj) : error LNK2019: unresolved external symbol __imp__RegOpenKeyExA@20 referenced in function <a href="mailto:_GetRegistrySysColors@8">_GetRegistrySysColors@8  

解决方法如下:

QT 加载

在.pro中加载

LIBS += -lGlAux -ladvapi32

VS 加载

#param comment (lib,"glaux.lib")

#param comment (lib,"advapi32.lib")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: