将文件加载到drawBackground(QPainter * painter,const QRectF&)

时间:2012-01-19 17:25:17

标签: file qt opengl load

目前我正在尝试将* .obj文件添加到我的程序中。我的代码基于这个例子:

Accelerate your widgets with OpenGL(changed link)

我的代码中唯一不同的是,我有一个glwidget类,其中定义了所有绘图。在OpenGLScene类中,只定义了我的Gui。在函数drawBackground(QPainter * painter,const QRectF&)中,我调用函数paintGL。

void OpenGLScene::drawBackground(QPainter *painter, const QRectF &)
{
    if (painter->paintEngine()->type() != QPaintEngine::OpenGL
    && painter->paintEngine()->type() != QPaintEngine::OpenGL2)
{
    qWarning("OpenGLScene: drawBackground needs a QGLWidget to be set as viewport on the graphics view");
    return;
}

painter->beginNativePainting();

glClearColor(m_backgroundColor.redF(), m_backgroundColor.greenF(), m_backgroundColor.blueF(), 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if (m_model) {

    m_model->paintGL();
}

painter->endNativePainting();

}

简单的绘图和东西工作正常。在我尝试加载* .obj-Files之前我才遇到问题。我尝试了几件事,但没有用。 现在我最终得到了解决方案,在我的glWidget-Class中定义模型类中的所有函数(可以在示例中找到),然后在paintGL中调用render-function。然后在OpenGLScene中调用paintGL。

在这里你可以看到我的头文件:OpenGLScene.h和GLWidget.h:

class GLWidget : public QGLWidget
{
Q_OBJECT
public:
float           m_distance;
GLWidget(const QString &filePath);
GLWidget(QWidget *parent = 0);
~GLWidget();
QSize           minimumSizeHint() const;
QSize           sizeHint() const;
void            initializeGL();
void            paintGL();
void            resizeGL(int width, int height);
void render() const;
QString fileName() const { return m_fileName; }
int faces() const { return m_pointIndices.size() / 3; }
int edges() const { return m_edgeIndices.size() / 2; }
int points() const { return m_points.size(); }
QString m_fileName;
QVector<Point3d> m_points;
QVector<Point3d> m_normals;
QVector<int> m_edgeIndices;
QVector<int> m_pointIndices;
};


#ifndef QT_NO_CONCURRENT
#include <QFutureWatcher>
#endif

class GLWidget;

class OpenGLScene : public QGraphicsScene
{
Q_OBJECT

public:
OpenGLScene();
void drawBackground(QPainter *painter, const QRectF &rect);
QDialog *createDialog(const QString &windowTitle) const;

void setModel(GLWidget *model);

//Model       *m_model;
GLWidget    *m_model;
QColor      m_backgroundColor;
float       m_distance;
QLabel      *m_labels[4];
QWidget     *m_modelButton;
#ifndef QT_NO_CONCURRENT
QFutureWatcher<GLWidget *> m_modelLoader;
#endif
public slots:
void loadModel();
void loadModel(const QString &filePath);
void modelLoaded();
};

不幸的是,这个想法无效,因为我收到了这个错误:

“在GUI线程之外使用pixmaps是不安全的”

但我真的不明白应该是什么意思。

1 个答案:

答案 0 :(得分:1)

如果您已将所有Model内容移至GLWidget,那么我假设您现在正在GLWidget中创建::loadModel个实例?如果是这样,那么请注意这是在新线程中创建的。看起来它在加载线程完成时不会自动移入主(GUI)线程。 QObject实际发生的是an open question

如果您想完全禁用线程以简化操作,请删除行

#ifndef QT_NO_CONCURRENT
#include <QFutureWatcher>
#endif

#ifndef QT_NO_CONCURRENT
QFutureWatcher<Model *> m_modelLoader;
#endif

在openglscene.h中。在OpenGLScene构造函数体中删除行

#ifndef QT_NO_CONCURRENT
    connect(&m_modelLoader, SIGNAL(finished()), this, SLOT(modelLoaded()));
#endif

OpenGLScene::loadModel(const QString &filePath)更改

#ifndef QT_NO_CONCURRENT
    m_modelLoader.setFuture(QtConcurrent::run(::loadModel, filePath));
#else
    setModel(::loadModel(filePath));
    modelLoaded();
#endif

    setModel(::loadModel(filePath));
    modelLoaded();

最后删除

#ifndef QT_NO_CONCURRENT
    setModel(m_modelLoader.result());
#endif

来自OpenGLScene::modelLoaded()