Gremlin92
@Gremlin92
Целеустремленный

Qt Visual Studio не разрешенный внешний символ QMetaObject?

Не дает компилировать программу 3 ошибки:
Ошибка	LNK2001	неразрешенный внешний символ "public: virtual struct QMetaObject const * __cdecl MyWidget::metaObject(void)const " (?metaObject@MyWidget@@UEBAPEBUQMetaObject@@XZ).

Ошибка	LNK2001	неразрешенный внешний символ "public: virtual void * __cdecl MyWidget::qt_metacast(char const *)" (?qt_metacast@MyWidget@@UEAAPEAXPEBD@Z).

Ошибка	LNK2001	неразрешенный внешний символ "public: virtual int __cdecl MyWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyWidget@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z).

Все из-за добавления в класс Q_OBJECT
// SimpleQtOpengl.cpp
//
#include <iostream>
#include <QtWidgets/QApplication>
#include <QtWidgets/qwidget.h>
#include "MyWidget.h"

int main(int argc,char*argv[])
{
    QApplication a(argc, argv);
    QWidget qw;
    MyWidget mw(&qw);
    mw.show();
    return a.exec();
}
//
//MyWidget.h
#pragma once
#include <QtGui/QtGui>
#include <QtWidgets/QtWidgets>
#include <QtWidgets/QPushButton>
class MyWidget
    :  public QOpenGLWidget
{
   Q_OBJECT
public:
    MyWidget(QWidget* parent);
    void initializeGL();
    void resizeGL(int nWidth, int nHeight);
    void paintGL();
private slots:
    void handleButton();
private:
    QPushButton* m_button;
};

//
//MyWidget.cpp
#include "MyWidget.h"
#pragma comment(lib,"Qt5Cored.lib")
#pragma comment(lib,"Qt5Guid.lib")
#pragma comment(lib,"Qt5Widgetsd.lib")
#pragma comment(lib,"Qt5OpenGLd.lib")
#pragma comment(lib,"Qt5OpenGLExtensionsd.lib")
#pragma comment(lib,"OpenGL32.lib")
MyWidget::MyWidget(QWidget* parent) // конструктор
{
    resize(300, 300); // задаем размеры окна
   
}

void MyWidget::initializeGL()
{
    QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions();
    f->glClearColor(0,0,0,0); // заполняем экран белым цветом
    glEnable(GL_DEPTH_TEST); // задаем глубину проверки пикселей
    glShadeModel(GL_FLAT); // убираем режим сглаживания цветов
    glEnable(GL_CULL_FACE); // говорим, что будем строить только внешние поверхности
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // фигуры будут закрашены с обеих сторон
 // создаем кнопку
    m_button = new QPushButton("My Button", this);
    // устанавливаем размер и положение кнопки
    m_button->setGeometry(QRect(QPoint(100, 100),
        QSize(200, 50)));
    connect(m_button, SIGNAL(released()), this, SLOT(handleButton()));
}

void MyWidget::resizeGL(int nWidth, int nHeight)
{
    glViewport(0, 0, nHeight, nHeight); // установка точки обзора
    glMatrixMode(GL_PROJECTION); // установка режима матрицы
    glLoadIdentity(); // загрузка матрицы
}

void MyWidget::paintGL() // рисование
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очистка экрана
    glMatrixMode(GL_MODELVIEW); // задаем модельно-видовую матрицу
    glLoadIdentity();           // загрузка единичную матрицу

    glColor4f(1,0,0,0); // задаем цвет
    glBegin(GL_QUADS); // говорим, что рисовать будем прямоугольник
    // задаем вершины многоугольника
    glVertex3f(0.5, 0.5, 0.5);
    glVertex3f(-0.5, 0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(0.5, -0.5, 0.5);
    glEnd();
}
void MyWidget::handleButton() {

    // меняем текст
    m_button->setText("Example");
    // изменяем размер кнопки
    m_button->resize(100, 100);
}
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы