主窗口是QWidget,内部通过QQuickWidget加载qml
一直用的好好的,但是今天在客户那里发现了一个问题,qml界面没有加载出来,
因为主窗口设置了无边框,允许透明,所以桌面上什么都看不到
windows任务栏上可以看到程序图标,表明已经成功启动,只是界面没加载出来
.h
QQuickWidget *m_contentView = nullptr;
cpp
m_contentView = new QQuickWidget();
m_contentView->setSource(QUrl("qrc:///Qml/main.qml"));
int outPadding = 0;
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(outPadding, outPadding, outPadding, outPadding);
layout->setSpacing(outPadding);
layout->addWidget(m_contentView);
setLayout(layout);
即使把QQuickWidget换成QQuickView也显示不了,
经过层层百度、google,把pro文件改了之后发现可以正常显示了
DEFINES += QT_DEPRECATED_WARNINGS \
QT_ANGLE_PLATFORM \
_USE_MATH_DEFINES
主要是添加了QT_ANGLE_PLATFORM
参考的https://www.qt.io/blog/2017/01/18/opengl-implementation-qt-quick-app-using-today
根据qt官方的介绍,可以通过设置系统的环境变量来改变opengl的渲染方式
在环境变量中设置,或者调用qputenv设置
QT_OPENGL=angle
QT_ANGLE_PLATFORM=warp
QT_OPENGL的设置方式有angle、software、desktop
QT_ANGLE_PLATFORM的设置方式有多种选择warp、d3d9、d3d11
具体pro文件中设置QT_ANGLE_PLATFORM和在环境变量中设置有没有区别,还没研究,QTCreator中调试的话,修改环境变量不一定能马上生效,要重启qtcreator。
强制使用angle:
在main方法的入口第一行写上
int main(){
#ifdef Q_OS_WIN
// Force use of OpenGL ES through ANGLE on Windows
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
#endif
....
}
打印opengl信息
#include <QLoggingCategory>
int main(){
....
QLoggingCategory::setFilterRules(QStringLiteral("qt.scenegraph.general=true"));
....
}
pro文件中加宏,main函数中调用QCoreApplication::setAttribute(Qt::AA_UseOpenGLES),添加环境变量都是解决方案。
为了方便测试,我在main.cpp中添加了一个函数
void handlePreEnv(){
FILE* f = fopen("./.env", "r");
if(!f){
qDebug()<<"no env file"<<endl;
return;
}
char data[1025];
int size = fread(data, 1024, 1, f);
qDebug()<<"get:"<<data<<endl;
if(size > 0){
QString env = data;
if(env.isEmpty()){
fclose(f);
return;
}
QStringList envArr = env.split(";");
for(auto it : envArr){
QStringList kv = it.split("=");
if(kv.size() == 2){
qputenv(kv[0].toUtf8(), kv[1].toUtf8());
qDebug()<<"set env"<<kv[0]<<"="<<kv[1]<<endl;
}
}
}
fclose(f);
}
在main函数的第一行调用handlePreEnv();同时在./.env文件中写上
QT_OPENGL=angle;QT_ANGLE_PLATFORM=warp
可以实现动态修改opengl模式,并且不影响其他程序。
如果不设置opengl模式,qt程序默认是动态设置的,优先desktop
===========================================================
如果程序已经发布可以在环境变量中设置
key=QT_OPENGL,value=software
或者
key=QT_OPENGL,value=angle
key=QT_ANGLE_PLATFORM,value=warp