关于嵌入式QT QML 竖屏屏幕显示为横屏

硬件平台:全志的A40I-H (从淘宝一家广州卖家买的开发板)

软件平台:Linux 内核版本3.10.65

QT版本:5.9.0

当时遇到的问题,在PC上运行一个qml的demo,是正常的横屏显示的。

但是交叉编译过后,烧录到开发板子上面,发现是旋转了90度显示 大致如下图所示: 

当时非常的头大,如果按照文档上面,使用QT QWidget生成的程序的话,是可以通过QT\_QPA\_EGLFS_ROTATION=90旋转90度,而QML写的程序却不行
尝试使用QT\_QPA\_EGLFS\_WIDTH 和 QT\_QPA\_EGLFS\_HEIGHT去设置宽高,也无果

后面在CSDN上面找到这位博主的帖子,帮助我解决了这个问题,链接为:嵌入式 Qt/Qml 屏幕旋转(横屏,竖屏)问题的解决

我是一个纯纯小白,当时也是不懂得怎么去修改我的代码,只po了关键部分代码上来。

在QT5.9.0中的Example程序,他们的根对象是QQmlApplicationEngine engine,而不是这位博主写QQuickView view,后面经过很多天的不断学习,我才知道其实是可以在main函数中修改根对象从而实现这位博主的方法。 我这里使用的Example是QT5.9.0中的示例wearable例子进行修改。
对原本生成的wearable.cpp进行一些修改:

#include <QGuiApplication>  
#include <QQmlApplicationEngine>  
#include <QQuickStyle>
#include <QQuickView> //添加Quickview所需的头文件
#include <QQuickItem> //添加QQuickTransform所需的头文件

//这个结构体是来自那位博主的代码
//作用按照我拙劣的理解应该是一个转置+平移的功能
//具体可以看那位博主的博客,里面有图片可以对照理解。
struct MyTransform : public QQuickTransform {
    MyTransform(QSizeF size) {
        tr_.rotate(270);
        tr_ *= QTransform::fromTranslate(0, size.width());
    }
    virtual void applyTo(QMatrix4x4 *matrix) const
    {
        *matrix = *matrix * tr_;
    }
    QTransform tr_;
};


int main(int argc, char *argv\[\])  
{  
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  
    QGuiApplication app(argc, argv);

//! \[style\]  
    QQuickStyle::setStyle(QStringLiteral("qrc:/qml/Style"));  
 //! \[style\]
#if 0  //屏蔽原本的engine根对象
    QQmlApplicationEngine engine;  
    engine.load(QUrl(QStringLiteral("qrc:/wearable.qml")));
#else //使用QQuickView作为根对象
    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/wearable.qml")));
    view.show();

//这几行是用来测试是否可以获取到这个Item,打印信息给自己看的。
  QQuickItem* rootItem = view.rootObject();
    if (rootItem) {
        // 对rootItem进行操作
        qDebug() << "Root object width:" << rootItem->width();
    } else {
        qDebug() << "Failed to get root object.";
    }
//这部分代码也是来自那位博主,用于实现旋转和平移。
    QQuickItem * root = view.rootObject();
    QSizeF size{root->width(), root->height()};
    view.resize(size.height(), size.width());
    (new MyTransform(size))->appendToItem(root);

#endif
return app.exec();  
}

 

在wearable.qml中进行修改
1.把原本的根元素QQC2.ApplicationWindow改为Item
2.把background属性、header属性、footer属性去掉

在window下显示的结果:

这个例子就可以旋转过来了,至于header和footer部分,需要自己修改一下即可。

同样的,改为Item后,Width和Height属性也要改为当前显示屏的分辨率。
我这块屏幕是10.1寸的竖屏,分辨率是800x1280,在QML的代码中,我设置
```
width: 1280
height: 800
```
最终交叉编译过后在板子上运行如下:

 

疑问:
其实我不是太懂以window作为根对象和以其他元素作为根对象的区别,因为我查阅其他视频资料发现,最早的QML根对象并不是以window作为根对象
我也不太确定,如此修改之后会不会对后续的代码开发造成一些影响,我猜可能一些window所属的属性需要自己重新实现,比如上面屏蔽掉的header、footer等等。


参考文档:
嵌入式 Qt/Qml 屏幕旋转(横屏,竖屏)问题的解决

 

posted @ 2023-11-06 17:58  mgshadow  阅读(387)  评论(0编辑  收藏  举报