Не дает компилировать программу 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);
}