Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 将文件加载到退税区(QPainter*painter,const QRectF&;)_File_Qt_Opengl_Load - Fatal编程技术网

File 将文件加载到退税区(QPainter*painter,const QRectF&;)

File 将文件加载到退税区(QPainter*painter,const QRectF&;),file,qt,opengl,load,File,Qt,Opengl,Load,目前我正在尝试将*.obj文件加载到我的程序中。我的代码基于以下示例: 我的代码中唯一的不同之处是,我有一个glwidget类,其中定义了所有图形。在OpenGLScene类中,仅定义了我的Gui。在函数trackground(QPainter*painter,const QRectF&)中,我调用函数paintGL void OpenGLScene::drawBackground(QPainter *painter, const QRectF &) { if (painter

目前我正在尝试将*.obj文件加载到我的程序中。我的代码基于以下示例:

我的代码中唯一的不同之处是,我有一个glwidget类,其中定义了所有图形。在OpenGLScene类中,仅定义了我的Gui。在函数trackground(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文件之前,我只会遇到问题。我试过几种方法,但都不管用。 现在,我得到了一个解决方案,在我的glWidget类中定义模型类(您可以在示例中找到)中的所有函数,然后在paintGL中调用render函数。然后在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();
};
class-GLWidget:public-QGLWidget
{
Q_对象
公众:
浮动m_距离;
GLWidget(常量QString和文件路径);
GLWidget(QWidget*parent=0);
~GLWidget();
QSize minimumSizeHint()常量;
QSize sizeHint()常量;
void initializeGL();
void paintGL();
空隙大小(内部宽度、内部高度);
void render()常量;
QString fileName()常量{return m_fileName;}
int faces()常量{返回m_pointindex.size()/3;}
int edges()常量{返回m_edgeIndices.size()/2;}
int points()常量{返回m_points.size();}
QString m_文件名;
q向量m_点;
q向量m_法线;
QVector m_边度;
向量m_点指数;
};
#ifndef QT\u否\u并发
#包括
#恩迪夫
类GLWidget;
类OpenGLScene:publicqgraphicscene
{
Q_对象
公众:
OpenGLScene();
无效牵引地面(油漆工*油漆工、施工工和维修工);
QDialog*createDialog(常量QString和windowTitle)常量;
void setModel(GLWidget*model);
//模型*m_模型;
GLWidget*m_模型;
QColor m_背景色;
浮动m_距离;
QLabel*m_标签[4];
QWidget*m_模型按钮;
#ifndef QT\u否\u并发
QFutureWatcher m_modelLoader;
#恩迪夫
公众时段:
void loadModel();
void loadModel(const QString和filePath);
void modeloaded();
};
不幸的是,这个想法行不通,因为我遇到了以下错误:

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


但是我真的不明白这意味着什么。

如果你已经将所有的
模型
东西移到
GLWidget
中,那么我假设你现在正在
中创建
GLWidget
实例::loadModel
?如果是这样,请注意这是在一个新线程中创建的。加载线程完成后,它似乎不会自动移动到主(GUI)线程中。实际发生在QObject上的是

如果要完全禁用线程以简化操作,请删除这些行

#ifndef QT_NO_CONCURRENT
#include <QFutureWatcher>
#endif
#ifndef QT_NO_CONCURRENT
    connect(&m_modelLoader, SIGNAL(finished()), this, SLOT(modelLoaded()));
#endif
OpenGLScene::loadModel(constqstring&filePath)
change中

#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()

如果您已将所有
Model
内容移动到
GLWidget
中,那么我假设您现在正在
::loadModel
中创建
GLWidget
实例?如果是这样,请注意这是在一个新线程中创建的。加载线程完成后,它似乎不会自动移动到主(GUI)线程中。实际发生在QObject上的是

如果要完全禁用线程以简化操作,请删除这些行

#ifndef QT_NO_CONCURRENT
#include <QFutureWatcher>
#endif
#ifndef QT_NO_CONCURRENT
    connect(&m_modelLoader, SIGNAL(finished()), this, SLOT(modelLoaded()));
#endif
OpenGLScene::loadModel(constqstring&filePath)
change中

#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()

Hm…也许我应该更详细地指定它。我的第一个问题是,为什么在glwidget中定义ModelFunction是一个问题?GLWidget的内容与模型类的内容相同,另外还有一些附加内容。因此,我不理解这个错误:“在GUI线程之外使用pixmaps是不安全的”,因为在OpenGLScene类中,除了数据类型名称之外,我没有任何更改。我已将模型数据类型替换为GLWidget数据类型。也许有人能帮我?或者,这是如此明显,以至于很容易回答。如果是这样的话,如果你能和我分享你的想法,我会很高兴。对于所有可能尝试过上面链接的代码的人。很抱歉,这是一个旧版本,不起作用。这是抱歉…也许我应该详细说明一下。我的第一个问题是,为什么在glwidget中定义ModelFunction是一个问题?GLWidget的内容与模型类的内容相同,另外还有一些附加内容。因此,我不理解这个错误:“在GUI线程之外使用pixmaps是不安全的”,因为在OpenGLScene类中,除了数据类型名称之外,我没有任何更改。我已将模型数据类型替换为GLWidget数据类型。也许有人能帮我?或者,这是如此明显,以至于很容易回答。如果是这样的话,如果你能和我分享你的想法,我会很高兴。对于所有可能尝试过上面链接的代码的人。很抱歉,这是一个旧版本,不起作用。这是SorryWell,据我所知,不可能像我尝试的那样加载obj文件。我试图将我的对象推入主线程,但它不起作用。我对穿线完全是个新手。我对这件事做了一些研究,但我无法掌握。线程的整个概念似乎是一件大事。有没有其他方法可以加载obj.-文件?也许不用穿线。从你的回答中,我感觉可能有一种可能性。你能说得更具体些吗?谢谢。@buddy:你当然可以很容易地删除线程,因为在使用线程的地方有两个代码路径。编译哪一个取决于QT_NO_并发预处理器宏。请确保在相关源文件的顶部定义了此宏,或者仅注释掉thr