Добавление дочернего виджета в другой виджет в Qt - PullRequest
0 голосов
/ 23 мая 2011

Несмотря на то, что у меня есть похожие вопросы, размещенные на stackoverflow, ни одно из их решений на самом деле не отвечает на мою проблему. У меня есть 2 независимых виджета, которые я хотел бы объединить (вставить один виджет в другой как дочерний): один представляет собой пользовательский интерфейс, созданный только с помощью Qt Creator (перетаскивание), а другой - анимацию, выполненную в Qt с помощью OpenGL. Я пытаюсь добавить анимацию в пользовательский интерфейс, и вот код:

glwidget.h (анимация):

<code>
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:
<code>
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()
{....
Что касается пользовательского интерфейса, у меня есть файл заголовка:
<code>
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:
<code>
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 Ответ

2 голосов
/ 23 мая 2011

Вы пытаетесь изменить центральный виджет на GL? Потому что указание родителя для виджета GL не меняет их. Если вы хотите изменить виджет на другой (используя конструктор), я рекомендую функцию «повысить до», с помощью которой вы можете изменить фактический класс виджета в конструкторе. Поэтому добавьте QWidget в пользовательский интерфейс, а затем продвигайте его в своем классе (GLWidget).

Кажется, проблема в вызове конструктора GLFormat в конструкторе GLWidget.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...