2014-10-30 3 views
0

Я довольно новичок в Qt. Я хотел создать простое приложение, в котором треугольник сгенерирован с использованием OpenGL и трех кнопок, изменяющих этот треугольный цвет. К сожалению, я получаю сообщение об ошибке:Qt, используя OpenGL, QGLWidget является приватным

E:\Programy\Qt\5.3\mingw482_32\include\QtOpenGL\qgl.h:457: error: 'QGLWidget::QGLWidget(const QGLWidget&)' is private Q_DISABLE_COPY(QGLWidget)

Я не знаю, что делать. Вот мой код:

mainwindow.h

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

    QVBoxLayout *layout; 

public: 
    MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 


private: 
    QPushButton *redButton; 
    QPushButton *greenButton; 
    QPushButton *blueButton; 

public slots: 
    void redSlot(Widget w); 
    void greenSlot(Widget w); 
    void blueSlot(Widget w); 

}; 

Слоты в mainwindow.cpp выглядеть следующим образом:

void MainWindow::redSlot(Widget w) 
{ 
    w.setColor(red); 
} 

Widget.h

class Widget : public QGLWidget 
{ 
    Q_OBJECT 

public: 
    Widget(QWidget *parent = 0); 

    QSize minimumSizeHint() const; 
    QSize sizeHint() const; 

    enum color c; 

    void setColor(enum color color1); 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 

}; 

перечисление цвет просто перечисление объявлен в другом заголовочном файле

enum color 
{ 
    red, 
    green, 
    blue 
}; 

ответ

2

Ваш Slots

void redSlot(Widget w); 
void greenSlot(Widget w); 
void blueSlot(Widget w); 

все принимают параметр типа Widget. Это пытается создать копию объекта при вызове. Ваш Widget является подклассом QGLWidget, который имеет закрытый конструктор копирования и поэтому не может быть вызван из объекта подкласса.

Как вы хотите изменить цвет существующего объекта, а не копию этого вы должны изменить функции, чтобы взять указатель этого объекта:

void redSlot(Widget*); 
void greenSlot(Widget*); 
void blueSlot(Widget*); 

void MainWindow::redSlot(Widget* w) 
{ 
    w->setColor(red); 
} 
+0

Не забудьте зарегистрировать указатель с помощью 'Q_DECLARE_METATYPE (Виджет *) ' –

+0

@DmitrySazonov Я не думаю, что указатели нуждаются в этом, я мог бы ошибаться, хотя –

+0

Спасибо! Это помогло мне! :) – user30935

Смежные вопросы