嵌入式 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 页面,调整到竖着的方向。然后屏幕物理方向旋转,就看起来正常。

                

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

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

实现方法

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

        首先,把长、宽换一下,这里 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);

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值