您当前的位置: 首页 > 

龚建波

暂无认证

  • 2浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

《QDebug 2020年2月》

龚建波 发布时间:2020-02-04 23:58:55 ,浏览量:2

一、Qt Widgets 问题交流 1.QOpenGLWidget在未显示状态下调用glDeleteXXX,程序异常结束

今天遇到了问题就是,我把QOpenGLWidget放在了QTabWidget中,当OpenGL组件没有在显示页的时候我关闭程序,那么就会卡在组件的析构函数释放资源的语句中:

glDeleteVertexArrays(1, &_VAO);
glDeleteBuffers(1, &_VBO);
glDeleteBuffers(1, &_EBO);

 奇怪的是用OpenGL的函数会卡住,但是用Qt封装的类就不会:

    makeCurrent();
    _vbo.destroy();
    _ebo.destroy();
    _vao.destroy();
    delete _texture1;
    delete _texture2;
    doneCurrent();

开始以为和 makeCurrent(); 切换上下文有关 ,但是试了下还是不行,索性先把OpenGL方式的释放语句注释了。

(2021-8-10)今天终于发现了问题所在,initializeGL() 在第一次调用 resizeGL 或 paintGL 之前被调用一次。但是如果没显示过,那就不会初始化,释放未初始化的对象就会崩掉,所以需要调用 isValid() 先判断是否已初始化,如这样写:

GLTexture::~GLTexture()
{
    //initializeGL在显示时才调用,释放未初始化的会异常
    if(!isValid())
        return;
    //QOpenGLWidget
    //三个虚函数不需要makeCurrent,对应的操作已由框架完成
    //但是释放时需要设置当前上下文
    makeCurrent();
    glDeleteVertexArrays(1, &vao);
    glDeleteBuffers(1, &vbo);
    glDeleteBuffers(1, &ebo);
    glDeleteTextures(1, &texture);
    glDeleteProgram(shaderProgram);
    doneCurrent();
}
2.Release版本QMessageLogContext的context.file和context.line为空

在Release版运行时,QMessageLogContext的context.file和context.line为空。原因是,Qt在Release版本默认舍弃了文件信息、行数等信息。需要在.pro文件定义一个宏,清除重新构建下

DEFINES += QT_MESSAGELOGCONTEXT
二、Qt Quick 问题交流 1.ListView横向滚动条不出来

ListView派生自Flickable,而他有一个flickable的设置,默认时根据方向来的。此外ListView竖向时,contentWidth默认为-1,也需要设置下。所以我们应该这样写(即加上前面两句设置):

    ListView{
        //竖向时默认-1
        contentWidth: 500
        //Flickable默认Flickable.AutoFlickDirection
        flickableDirection: Flickable.AutoFlickIfNeeded

        //orientation: Qt.Vertical
        //boundsBehavior: Flickable.StopAtBounds
        //model: 20
        //spacing: 5
        //delegate: 
        ScrollBar.vertical: ScrollBar{
        }
        ScrollBar.horizontal: ScrollBar{
        }
    }
2.Loader加载的ListView已经设置了focus但还是不能用按键切换currentItem

一般ListView在设置focus为true后才能用键盘方向键进行切换选中项,当把ListView放到Loader后我发现按键没效果了。将Loader的focus设置为true之后,又可以正常切换了。

3.Layout中的Image保持原比例
    RowLayout{
        anchors.fill: parent
        Image {
            Layout.fillHeight: true
            Layout.preferredWidth:sourceSize.width/sourceSize.height*height
            source: ""
        }
    }

关注
打赏
1655829268
查看更多评论
立即登录/注册

微信扫码登录

0.1483s