触摸屏启用VNC后校准异常

2 篇文章 0 订阅

QT4.8

 

问题描述:1920x1080的触摸屏硬件180°旋转,所以软件也要旋转180°才能正常显示,但是部署vnc后进行校准,结果触摸时触点与界面刚好相反旋转180°

部署vnc前环境变量QWS_DISPLAY="Transformed:Rot180:Linuxfb:/dev/fb0:depth=24:0"

部署vnc后环境变量

QWS_DISPLAY="Multi:Transformed:Rot180:Linuxfb:/dev/fb0:depth=24:0 VNC:paintonscreen:size=1920x1080:depth=24:1"

1、分析校准程序

从现象来看校准后触摸点与界面刚好相反旋转180°,怀疑配置旋转180°在校验时失效,调试程序打印qt_screen->transformOrientation()旋转度数

   发现打印出来是0°,说明旋转无效。 

  qt_screen->classId()打印其id查看类型结果是QScreen::MultiClass类型

QScreen::MultiClass类型继承QScreen但是没有重新实现transformOrientation函数,所以相当于调用QScreen的transformOrientation函数,其实现直接返回0,如下;

int QScreen::transformOrientation() const
{
    return 0;
}

2、将vnc配置还原重新调试qt_screen->classId()是QScreen::TransformedClassl类型,其实现了重新实现transformOrientation函数,能正常返回旋转角度。

3、为什么qt_screen类型不一样,他是怎么初始化的?

查看代码实在构造QApplication时候调用d->construct();里面的qt_init进行初始化的

QApplication::QApplication(int &argc, char **argv, int _internal)
    : QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient, _internal))
{ Q_D(QApplication); d->construct(); }

这里需要注意的是我们的qt_init/qt4.8.7/src/gui/kernel/qapplication_qws.cpp里面的函数。

继续分析找到init_display

qt_fbdpy = new QWSDisplay();

QWSDisplay::QWSDisplay()
{
    d = new Data(0, qws_single_process);
}

QWSDisplay::Data::Data(QObject* parent, bool singleProcess)
{
#ifdef QT_NO_QWS_MULTIPROCESS
    Q_UNUSED(parent);
    Q_UNUSED(singleProcess);
#else
    if (singleProcess)
        csocket = 0;
    else {
        csocket = new QWSSocket(parent);
        QObject::connect(csocket, SIGNAL(disconnected()),
                         qApp, SLOT(quit()));
    }
    clientLock = 0;
#endif
    init();
}

void QWSDisplay::Data::init()函数里面找到qt_get_screen,qt_screen就是在这里初始化的

QScreen *s = qt_get_screen(qws_display_id, qws_display_spec.constData());

从代码分析,qt_screen就是根据QWS_DISPLAY配置的第一个冒号前面的驱动名称创建的

所以配置vnc前创建的qt_screen是QTransformedScreen类型的,配置后是QMultiScreen类型的。

然后连接的时候QMultiScreen会继续将后面的配置驱动添加到自己的子类下面

知道了qt_screen是怎么来的,就知道怎么解决:如下

修改校准程序处理:先保存原始qt_screen, old_qt_screen=qt_screen;,然后将其子类TransformedClass的类赋值给qt_screen,使用校准完成后再赋值回去qt_screen=old_qt_screen;

    if(qt_screen->classId()==QScreen::MultiClass)
    {
        QScreen* p=qt_screen;
        if(p)
        {
            QList<QScreen*>tmp= p->subScreens();
            for(int i=0;i<tmp.size();i++)
            {
                if(tmp.at(i)->classId()==QScreen::TransformedClass)
                {
                    qt_screen=tmp.at(i);
                    break;
                }
            }
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值