菜鸟修炼笔记–QT–实现将QT整体界面进行旋转

前言

由于新项目使用的屏幕为竖屏,于是就有了将QT整体旋转90°的需求。在网上搜寻各种资料后,现在将获取到的信息和测试的过程和结果整合一下,以便之后查询。

一。QGraphicsScene法

1. 主要思路

此方法的主要思路就是将所有的项目界面都加载到QGraphicsScene中,再使用QGraphicsScene的方法来进行旋转操作。

2. 主要代码

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsProxyWidget>
#include "mainwindow.h"
int main(int argc, char *argv[])
{    
    QApplication a(argc, argv);
    MainWindow *from = new MainWindow; //项目主窗口
    QGraphicsScene *scene = new QGraphicsScene;    
    QGraphicsProxyWidget *w = scene->addWidget(form);  
    w->setRotation(90);    
    QGraphicsView *view = new QGraphicsView(scene);    
    view->resize(810, 610);    
    view->show();
    return a.exec();
}

3. 名词介绍

3.1 QGraphicsScene

QGraphicsScene类提供了一个用于管理大量2D图形项的表面。

该类用作QGraphicsItems的容器。它与QGraphicsView一起使用,用于在2D表面上可视化图形项,如线、矩形、文本,甚至自定义项。QGraphicsScene是图形视图框架的一部分。

QGraphicsScene还提供了一些功能,可以让您有效地确定物品的位置,并确定在场景的任意区域内哪些物品是可见的。使用QGraphicsView小部件,您可以可视化整个场景,也可以放大并只查看场景的一部分。

3.2 QGraphicsProxyWidget

QGraphicsProxyWidget类提供了一个代理层,用于在QGraphicsScene中嵌入QWidget。

QGraphicsProxyWidget嵌入基于qwidget的小部件,例如,QPushButton,
QFontComboBox,甚至QFileDialog,到QGraphicsScene。它在两个对象之间转发事件,并在QWidget基于整数的几何形状和qgraphicwidget基于qreal的几何形状之间进行转换。QGraphicsProxyWidget支持QWidget的所有核心功能,包括tab焦点、键盘输入、拖放和弹出窗口。您还可以嵌入复杂的小部件,例如小部件与子部件。

3.3 QGraphicsView

QGraphicsView类提供了一个用于显示QGraphicsScene内容的小部件。

QGraphicsView在可滚动的视口中可视化QGraphicsScene的内容。要创建带有几何项的场景,请参阅QGraphicsScene的文档。QGraphicsView是图形视图框架的一部分。

要可视化一个场景,首先要构造一个QGraphicsView对象,将您想要可视化的场景的地址传递给QGraphicsView的构造函数。或者,您可以调用setScene()在稍后的时候设置场景。在你调用show()之后,默认情况下视图会滚动到场景的中心,并显示当前可见的任何项目。

4. 缺点

  1. 如果某个窗口与主窗口没有父子关系,这个窗口没有添加到scene中,也就不能同步旋转。
  2. 这种方法疑似对切换窗口时的焦点切换有影响。

5. 使用注意事项

  1. 使用此方法的qt程序尽量不使用QDialog,而用QWidget代替:因为在使用QDialog类的时候,如果不设置此dialog的父窗口,此dialog就不能同步旋转;但如果设置了dialog的父窗口,因为QDialog的特性,dialog会显示在父窗口的中央,且无法移动窗口。
  2. 如果要将QT背景设置为透明,除了需要将主窗口设置为透明还需要将QGraphicsView和QGraphicsScene设置为透明
    QGraphicsView *view = new QGraphicsView(scene);
    view->setStyleSheet(QString("background-color: rgba(0, 0, 0, 0);"));

    QGraphicsScene *scene = new QGraphicsScene;
    scene->setForegroundBrush(QColor(255, 255, 255, 0));
  1. 如果需要在同一个QT程序中显示另一个不同方向的界面,从而实现一个QT程序中有两个方向的界面,可以再用一次这个框架:
	calib_widget = new Calib_Widget();//不可设置父窗口
    this->hide();
    this->releaseKeyboard();
    calib_widget->grabKeyboard();
    scene = new QGraphicsScene(this);//设置父窗口
    scene->setForegroundBrush(QColor(255, 255, 255, 0));
    QGraphicsProxyWidget *w = scene->addWidget(calib_widget);
    w->setRotation(180);
    view = new QGraphicsView(scene);
    view->setStyleSheet(QString("background-color: rgba(0, 0, 0, 0);"));
    view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//设置垂直方向没有移动栏
    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view->resize(1280,720);
    view->show();

这里要注意的是:进入新建的这个界面后,尽管设置了焦点,但焦点还是会丢失,目前具体原因还不明。怀疑必须得是该界面所在的线程中才可以设置其焦点。

而解决的一种方法是:在新建的这个界面的构造函数中开启一个定时器来初始化这个界面的焦点。(可以看出此方法并不是根本解决方法)

二。配置QT环境法。

1. 基本思路

通过配置QT的环境,来实现旋转。

2. 具体操作

运行QT程序前,先配置好QT的环境,这样再运行QT就可以实现旋转了:

export QT_QPA_PLATFORM='linuxfb:rotation=270'

3. 缺点:

  1. QT中的字体会发生变化,所以需要重新更改字体大小。
  2. 如果一个QT程序中有两种方向的界面,就需要用到第一种方法了。

三。配置QT运行参数法

1. 基本思路

在运行qt的应用程序时,对应用程序进行配置,以对QT程序进行配置,从而达到旋转的目的:

XXX -qws -display Transformed:Rot90

2. 其他:

本人按照自己的理解尝试验证此方法是否有效,但是没有成功,不知道是不是我的方式有问题。


版权声明:本文为chen9807原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>