jjzjj

c++ - Qt 和 OpenGL 窗口 - 调整大小时闪烁

coder 2024-02-06 原文

看起来如果我拖动调整大小足够快,窗口本身是通过子类化 qwindow 并在其上创建 openGLcontext 创建的

代码:

#include <QGuiApplication>
#include <QOpenGLContext>
#include <QWindow>
#include <QOpenGLFunctions_3_3_Core>
#include <stdio.h>

class OpenGLWindow : public QWindow, protected QOpenGLFunctions_3_3_Core{

     public:
     explicit OpenGLWindow();
     ~OpenGLWindow();
     virtual void render();
     bool isWindowInitialized;
     void exposeEvent(QExposeEvent *event);
     bool event(QEvent *event);

     private:
     QOpenGLContext* ctx;
     QSurfaceFormat* fmt;
     bool isGLInitialized;
     GLuint VertexArrayID;
     GLuint buffer1;
     GLuint ProgramID;
};

bool OpenGLWindow::event(QEvent *event)
{
     switch (event->type()) {
     case QEvent::UpdateRequest:
     render();
     return true;
     case QEvent::Close:
     glDisableVertexAttribArray(0);
     glDeleteBuffers(1, &buffer1);
     glDeleteVertexArrays(1, &VertexArrayID);
     glDeleteProgram(ProgramID);
     return QWindow::event(event);
     case QEvent::Resize:
     if(isWindowInitialized && isGLInitialized)glViewport(0,0,width(),height());
     return QWindow::event(event);
     default:
     return QWindow::event(event);
     }
}

void OpenGLWindow::exposeEvent(QExposeEvent *event)
{
    Q_UNUSED(event);
    if (isExposed())render();
}

OpenGLWindow::OpenGLWindow()
    :ctx(new QOpenGLContext)
    ,fmt(new QSurfaceFormat)
    ,isGLInitialized(0)
{
     setSurfaceType(OpenGLSurface);
     fmt->setRenderableType(QSurfaceFormat::OpenGL);
     fmt->setVersion(3,3);
     resize(640,480);
     fmt->setProfile(QSurfaceFormat::CoreProfile);
     setFormat(*fmt);
     ctx->setFormat(*fmt);
     ctx->create();
}

OpenGLWindow::~OpenGLWindow()
{}

void OpenGLWindow::render(){

 //if(Image::isWindowInitialized || isExposed())return;

 if(!isGLInitialized){

         ctx->makeCurrent(this);
         initializeOpenGLFunctions();

         GLuint vsID = glCreateShader(GL_VERTEX_SHADER);
         GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER);

         const char* vs="#version 330 core\n layout(location = 0) in vec3 vertexPosition_modelspace; \n void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0;}";

         const char* fs="#version 330 core\n out vec4 color;\n void main(){ color = vec4(1,0,0,1);}";

         glShaderSource(vsID, 1, &vs , NULL);
         glCompileShader(vsID);
         GLint isCompiled = 0;
         glGetShaderiv(vsID, GL_COMPILE_STATUS, &isCompiled);

         if(isCompiled == GL_FALSE){
         GLint maxLength = 0;
         glGetShaderiv(vsID, GL_INFO_LOG_LENGTH, &maxLength);
         char info[512];
         glGetShaderInfoLog(vsID, maxLength, &maxLength, info);
         printf("%s",info);}

        glShaderSource(fsID, 1, &fs , NULL);
         glCompileShader(fsID);
         glGetShaderiv(fsID, GL_COMPILE_STATUS, &isCompiled);

        if(isCompiled == GL_FALSE){
         GLint maxLength = 0;
         glGetShaderiv(fsID, GL_INFO_LOG_LENGTH, &maxLength);
         char info[512];
         glGetShaderInfoLog(fsID, maxLength, &maxLength, info);
         printf("%s",info);
        }

        GLuint ProgramID = glCreateProgram();
         glAttachShader(ProgramID, vsID);
         glAttachShader(ProgramID, fsID);
         glLinkProgram(ProgramID);
         glDeleteShader(vsID);
         glDeleteShader(fsID);

        static const GLfloat data1[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f };


        glGenVertexArrays(1, &VertexArrayID);
        glBindVertexArray(VertexArrayID);
        glGenBuffers(1, &buffer1);
        glBindBuffer(GL_ARRAY_BUFFER,buffer1);
        glBufferData(GL_ARRAY_BUFFER, sizeof(data1),data1, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0 ,3 ,GL_FLOAT ,GL_FALSE,0 ,(void*)0 );
        glClearColor(1.0f, 0.0f, 0.4f,1.0f);
        glUseProgram(ProgramID);
        glViewport(0,0,width(),height());
        isGLInitialized=true;
    }

     if(isExposed()){
     glClear( GL_COLOR_BUFFER_BIT );
     glDrawArrays(GL_TRIANGLES, 0, 3);
     ctx->swapBuffers(this);
     }
}

int main(int argc, char **argv)
{
     QGuiApplication app(argc, argv);
     OpenGLWindow* win = new OpenGLWindow();
     win->show();
     win->isWindowInitialized=true;
     return app.exec();
}

我在 Qt Creator 3.4.1 上使用 Qt 5.4.2 套件:桌面 Qt 5.4.2 MSVC2013 64 位

我在这里迷路了,因为我从来没有在 qt 中使用过 openGL,而且我很难想象问题可能出在哪里

最佳答案

尝试设置以下任意属性的组合:

this->setAttribute(Qt::WA_OpaquePaintEvent, true);
this->setAttribute(Qt::WA_PaintOnScreen, true);
this->setAttribute(Qt::WA_DontCreateNativeAncestors, true);
this->setAttribute(Qt::WA_NativeWindow, true);
this->setAttribute(Qt::WA_NoSystemBackground, true);
this->setAttribute(Qt::WA_MSWindowsUseDirect3D, true);
this->setAutoFillBackground(false);

关于c++ - Qt 和 OpenGL 窗口 - 调整大小时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267979/

有关c++ - Qt 和 OpenGL 窗口 - 调整大小时闪烁的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  5. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  8. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  9. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐