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

        嵌入式 Linux 的一个小屏幕,正常是竖屏模式,可是我们产品中需要横着使用。

        Qml 代码已经写好了,在 PC 正常工作。然后移植到嵌入式 Linux,问题来了,屏幕方向不对,显示不正常。

        那就去网上找方法吧。

不可行方案

  • 方案一:
export QT_QPA_EGLFS_ROTATION=90

        没有任何效果。 

  • 方案二:
export QT_QPA_ROTATION=linuxfb:rotation=90

         结果显示是旋转过来了,但是点击(触摸屏)没有效果。应该是 input 的坐标系并没有改变。

  • 方案三:

        没有办法,底层解决不了,只能上层应用层来解决了。所以想看看 Qt 有没有 API 可以调整屏幕方向。各种找,没有。虽然官方说 Android 平台可以在 AndroidManifest 指定屏幕方向,但是 Linux 平台没有任何说法。

        所以还是手动,自己做。QQuickWindow 窗口没有旋转的方法,所以我们又想到用 QQuickWidget ,Widget 封装的 QGraphicsItem 里面,最后在放在 QGraphicsView 里面。终于把显示转过来了。但是与方案1一样,不能点击。

        于是各种怀疑触摸处理的问题,怀疑 TapHandler 问题,尝试换成 MouseArea,都没有效果。

        终于,我们还是觉得这太复杂了,应该是旋转导致了点击失效。

可行方案

        最终是可行方案出场了。

        窗口旋转是不考虑了,把长、宽换一下。也就是我们要把一个横着的 Qml 页面,调整到竖着的方向。然后屏幕物理方向旋转,就看起来正常。

嵌入式 Qt/Qml 屏幕旋转(横屏,竖屏)问题的解决_第1张图片                嵌入式 Qt/Qml 屏幕旋转(横屏,竖屏)问题的解决_第2张图片

         一开始是左边这样的,当然,屏幕外面是看不到的。然后将 Qml 根节点旋转+平移,变成右边这样的。

嵌入式 Qt/Qml 屏幕旋转(横屏,竖屏)问题的解决_第3张图片

         然后屏幕物理转一下,是不是就正常了。

实现方法

        说了这么多,怎么实现呢?

        首先,把长、宽换一下,这里 root 的长宽是期望(横屏时)的尺寸:

QQuickView view;
......
QQuickItem * root = view.rootObject();
QSizeF size{root->width(), root->height()};
view.resize(size.height(), size.width());

        然后需要实现一个 QQuickTransform,这里先逆时针旋转 90 度(即顺时针 270 度),然后向下平移整个高度:

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_;
};

        最后将变换增加到 root item 中,就完成了:

(new MyTransform(size))->appendToItem(root);

你可能感兴趣的:(Linux,Qt/QML,嵌入式,qt,qml)