1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > linux下arm架构中 触摸屏下没有鼠标事件 采用qtouchevent事件来代替 左右滑动显示完文本

linux下arm架构中 触摸屏下没有鼠标事件 采用qtouchevent事件来代替 左右滑动显示完文本

时间:2024-01-21 06:33:42

相关推荐

linux下arm架构中 触摸屏下没有鼠标事件 采用qtouchevent事件来代替 左右滑动显示完文本

有个这样的需求,我打算用qlabel显示文本,但是发现文本太长之后,显示不全,或者显示不完,最后就有2个方法:

第一就是滚屏显示,整个文本滚屏完成,再重新从左边开始滚屏。

第二就是鼠标实现一个自定义基于qwwidget的控件,在里面拖动文本,这个时候发现,arm下由于是触屏的,没有鼠标设备,所以最终需要采用qtouchevent来替代,整体上这3个类代码都是为了解决显示文本不全的时候采取的方法。

#ifndef TOUCHMOVE_H#define TOUCHMOVE_H#include <QObject>#include <QWidget>#include <QPainter>#include <QPainterPath>#include <QMouseEvent>#include <QPropertyAnimation>#include <QTouchEvent>class touchmove : public QWidget{Q_OBJECTpublic:enum MoveWay{LeftToRight,RightToLeft};public:explicit touchmove(QWidget *parent = nullptr);~touchmove();public:void mousePressEvent(QMouseEvent *event); //单击void mouseReleaseEvent(QMouseEvent *event);//释放void mouseMoveEvent(QMouseEvent *event); //移动public:bool touchBeginEventProcess(QEvent *event);bool touchUpdateEventProcess(QEvent *event);bool touchEndEventProcess(QEvent *event);protected:void paintEvent(QPaintEvent *event);bool eventFilter(QObject *object, QEvent *event);public:void updateTextPosition();void setText(const QString &txt);public:int m_currentWidth;int m_currentHeight;MoveWay m_direction = LeftToRight;bool canMove;bool bPressed;int m_deviation;int m_mouseSrcPos;int text_wpixel; //储存的当前widget内字符串的像素水平长度int left;// 标明当前的像素滚动量QColor normalBgColor;//正常背景颜色QString blank;//空格int blank_wp;//空格的像素宽度QString strText;qint32 spixel;// 一次滚动多少像素QPoint startPoint;QPoint endPoint;signals:public slots:};#endif // TOUCHMOVE_H

#include "touchmove.h"#include <QDebug>touchmove::touchmove(QWidget *parent) : QWidget(parent){this->setAttribute(Qt::WA_AcceptTouchEvents);this->installEventFilter(this);normalBgColor = QColor(206, 206, 206);canMove = false;bPressed = false;text_wpixel = 0; //文本的像素长度blank = " ";//空格QFont ft = font();// 获取当前字体的格式,里面有文本大小和文本像素大小QFontMetrics fm(ft); // 以当前的字体格式为基础blank_wp = fm.horizontalAdvance(blank);//空格的像素宽度,方便后面计算是否到达末尾m_deviation = 0;m_mouseSrcPos = 0;m_currentWidth = this->width();m_currentHeight = this->height();spixel = 1;// 一次滚动多少像素m_direction = LeftToRight;//0=方向默认向左,1=方向默认向右}touchmove::~touchmove(){}void touchmove::mousePressEvent(QMouseEvent *event) //单击{return;if(!canMove)return;if(event->button() == Qt::LeftButton){bPressed = true;m_mouseSrcPos = event->pos().x();//qDebug()<<"m_mouseSrcPos==="<<m_mouseSrcPos<<"m_currentWidth="<<m_currentWidth<<__FUNCTION__<<__LINE__;;}}//释放void touchmove::mouseReleaseEvent(QMouseEvent *event){return;if(bPressed){bPressed = false;}}void touchmove::mouseMoveEvent(QMouseEvent *event) //移动{return;if(!canMove)return;if(bPressed){m_deviation = event->pos().x() - m_mouseSrcPos;if(m_deviation > 0){left += spixel;// (0,0)在左上角,每次增加对应像素if((left + 0) > (m_currentWidth) )// 表示到末尾了left = 0; //重新添加,负数代表从最右边开始m_direction = RightToLeft;}else if(m_deviation < 0){left -= spixel;// (0,0)在左上角,每次增加对应像素if((left + 0) <= - (m_currentWidth) )// 表示到末尾了left = 0; //重新添加,负数代表从最右边开始m_direction = LeftToRight;}update();}}bool touchmove::touchBeginEventProcess(QEvent *event){qDebug()<<"i comeing here "<<__FUNCTION__<<__LINE__<<"....."<<__FILE__;if(canMove){QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchStartPoints = touchEvent->touchPoints();startPoint = touchStartPoints.at(0).screenPos().toPoint();//touch开始触控的点坐标bPressed = true;qDebug()<<startPoint<<__FUNCTION__<<__LINE__<<".cpp="<<__FILE__;touchEvent->accept();}return true;}bool touchmove::touchUpdateEventProcess(QEvent *event){qDebug()<<"i comeing here "<<__FUNCTION__<<__LINE__<<"....."<<__FILE__;QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchUpdatePoints = touchEvent->touchPoints();qDebug()<<"touchUpdatePoints.count()="<<touchUpdatePoints.count()<<__FUNCTION__<<__LINE__<<".cpp="<<__FILE__;// 设置单指触控,还是多指触控//if (1 == touchUpdatePoints.count()){// 假设此时场景,手指滑动了QPoint nowPoint = touchUpdatePoints.at(0).screenPos().toPoint(); // screenPos 当前坐标的位置QPoint lastPoint = touchUpdatePoints.at(0).lastScreenPos().toPoint(); // 上一次坐标的位置endPoint = nowPoint; // 手指滑动后,记录一下最后松开的 坐标位置m_deviation = endPoint.x() - startPoint.x();if(m_deviation > 0){//qDebug()<<"left to right,m_deviation >0"<<m_deviation<<"m_currentWidth="<<m_currentWidth<<"left="<<left<<__FUNCTION__<<__LINE__;;left += spixel;if((left + 0) > (m_currentWidth))left = 0;m_direction = LeftToRight;}else if(m_deviation < 0){//qDebug()<<"right to left,m_deviation<0"<<m_deviation<<"m_currentWidth="<<m_currentWidth<<"left="<<left<<__FUNCTION__<<__LINE__;;left -= spixel;if((left + 0) <= -(m_currentWidth))left = 0;m_direction = RightToLeft;}update();}return true;}bool touchmove::touchEndEventProcess(QEvent *event){qDebug()<<"i comeing here "<<__FUNCTION__<<__LINE__<<"....."<<__FILE__;QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);// 这里或者 touchUpdateEventProcess 当中去处理,根据初始和结束坐标,做其它处理if(bPressed){bPressed = false;}/* 比如上述touch空白处退出窗口的需求,根据前后坐标,满足设定的阈值(10 - 20 像素就好),就释放退出信号*/touchEvent->accept();return true;}bool touchmove::eventFilter(QObject *object, QEvent *event){qDebug()<<"i comeing here "<<__FUNCTION__<<__LINE__<<"....."<<__FILE__;if (object == this) {switch (event->type()){case QEvent::TouchBegin:return touchBeginEventProcess(event);case QEvent::TouchUpdate:return touchUpdateEventProcess(event);case QEvent::TouchEnd:return touchEndEventProcess(event);default:return false;}}return true;}void touchmove::paintEvent(QPaintEvent *event){qDebug()<<"i comeing here "<<__FUNCTION__<<__LINE__<<"....."<<__FILE__;QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);painter.save();painter.setPen(Qt::NoPen);painter.setBrush(this->normalBgColor);QRect bgRect(0,0,m_currentWidth,m_currentHeight);painter.drawRect(bgRect);painter.restore();painter.save();QPainter pen(this);QString str = blank + strText;pen.drawText(left,0,text_wpixel,m_currentHeight,Qt::AlignVCenter | Qt::AlignLeft, str);//根据给定的矩形坐标,绘制标签painter.restore();}void touchmove::updateTextPosition(){//获取文本大小,小于文本框长度,则无需滚动QFont ft = font();// 获取当前字体的格式,里面有文本大小和文本像素大小QFontMetrics fm(ft); // 以当前的字体格式为基础#if QT_VERSION > QT_VERSION_CHECK(5,11,0)//根据官方文档说明,5.11后使用新的函数text_wpixel = fm.horizontalAdvance(strText); //以当前的字体格式为基础,计算字体的像素宽度#elsetext_wpixel = fm.width(text() ); //以当前的字体格式为基础,计算字体的像素宽度#endifif( (text_wpixel > this->width()))// **长度或高度超出本身label的像素大小,则开启滚动***关键判断{left = 0; // 标志当前的像素滚动量#if QT_VERSION > QT_VERSION_CHECK(5,11,0)//根据官方文档说明,5.11后使用新的函数blank = " ";//空格blank_wp = fm.horizontalAdvance(blank );//空格的像素宽度,方便后面计算是否到达末尾#elseblank = " ";//空格blank_wp = fm.width(blank );//空格的像素宽度#endifcanMove = true;}else//关闭文本框滚动{left = 0; // 标志当前的像素滚动量canMove = false;}}void touchmove::setText(const QString &txt){strText = txt;m_currentWidth = this->width();m_currentHeight = this->height();updateTextPosition();update();}

调用方法,声明一个控件对象,然后调用对象的方法settext设置文本就可以看效果,里面的鼠标事件实际上没有效果的,我没有删除代码,

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。