硬件平台:全志的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 屏幕旋转(横屏,竖屏)问题的解决
标签:size,QT,竖屏,横屏,qml,include,wearable,view From: https://www.cnblogs.com/mgshadow/p/17813338.html