一、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: ""
}
}