QQuickWidget在部分机型中显示不出来

主窗口是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值