在Qt中将子窗口小部件添加到另一个窗口小部件

时间:2011-05-23 08:47:34

标签: c++ opengl qt4

尽管我在stackoverflow上发布了类似的问题,但他们的解决方案都没有真正回应我的问题。我有两个独立的小部件,我想要组合(将一个小部件作为一个小孩插入另一个小部件):一个是仅使用Qt Creator创建的UI(拖放),另一个是在Qt中完成的动画OpenGL的。我试图在UI中添加动画,这是代码:

glwidget.h(动画):


class GLWidget : public QGLWidget
{
public:
    GLWidget(QWidget *parent);
    ~GLWidget();
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
    void drawCube(int i, GLfloat z, GLfloat ri, GLfloat jmp, GLfloat amp);
    QGLFramebufferObject *fbo;
};
和glwidget.cpp:

GLWidget::GLWidget(QWidget *parent)
  : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
    makeCurrent();
    fbo = new QGLFramebufferObject(512, 512);
    timerId = startTimer(20);
}
GLWidget::~GLWidget()
{
    glDeleteLists(pbufferList, 1);
    delete fbo;
}
void GLWidget::initializeGL()
{....
至于UI,我有头文件:

class ClaraTeCourseSimulator : public QMainWindow
{
    Q_OBJECT
public:
    explicit ClaraTeCourseSimulator(QWidget *parent = 0);
    ~ClaraTeCourseSimulator();
private:
    Ui::ClaraTeCourseSimulator *ui;
    GLWidget *defaultAnim;
protected:
    void setupActions();
protected slots:
    void addAnimWidget();
};
和.cpp文件:

ClaraTeCourseSimulator::ClaraTeCourseSimulator(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ClaraTeCourseSimulator)
{
    ui->setupUi(this);
    defaultAnim = new GLWidget(ui->centralWidget);
}
void ClaraTeCourseSimulator::setupActions()
{
    connect(ui->actionCar_Modelling, SIGNAL(triggered(bool)), ui->centralWidget,
            SLOT(addAnimWidget()));
}
void ClaraTeCourseSimulator::addAnimWidget()
{
    ui->centralWidget->layout()->addWidget(defaultAnim);
}
ClaraTeCourseSimulator::~ClaraTeCourseSimulator()
{
    delete ui;
}

但是当我尝试运行它时,我得到了大约24个错误: imp _ZN9QGLFormatD1Ev 的未定义引用都指向glwidget.cpp中的构造函数和析构函数。

我做错了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您是否尝试将中央窗口小部件更改为GL窗口小部件?因为指定GL小部件的父级不会更改它们。如果您想将窗口小部件更改为另一个窗口小部件(使用Designer),我建议使用“提升到”功能,您可以使用该功能在设计器中更改窗口小部件的实际类。因此,在UI上添加一个QWidget,然后将其提升到您的类(GLWidget)。

似乎问题在于GLWidget构造函数中的GLFormat构造函数调用。