2014-10-30 68 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类型的参数。这会尝试在被调用时创建对象的副本。您的WidgetQGLWidget的子类,它具有私有拷贝构造函数,因此不能从子类对象中调用。

当你想改变现有的物体的颜色,而不是它的一个副本,你应该改变职能,采取对象的指针:

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

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

不要忘记通过'Q_DECLARE_METATYPE注册指针(Widget *)' – 2014-10-30 08:21:30

+0

@DmitrySazonov我不认为指针需要,我可能错了,虽然 – 2014-10-30 08:46:48

+0

谢谢!这帮助了我! :) – user30935 2014-10-30 09:41:03