Qt 旋转图片或控件

Qt直接旋转一张图片,会发生错位。所以应该修正一下。

定时旋转一张图片,修正位置后,很好。旋转控件类似

[html]  view plain  copy
  1. QTimer* m_pRotatePointerTimer = new QTimer(this);  
  2. connect(m_pRotatePointerTimer, SIGNAL(timeout()), SLOT(OnEventRotatePointer()));  
  3. m_pRotatePointerTimer->start(1000);  


[html]  view plain  copy
  1. void OnEventRotatePointer()  
  2. {  
  3.     QPixmap pix(":/main-icon/image/main-icon/14.2.png");  
  4.     static int rat = 0;  
  5.     rat = rat >= 360 ? 0 : rat + 30;  
  6.     int imageWidth = pix.width();  
  7.     int imageHeight = pix.height();  
  8.     QPixmap temp(pix.size());  
  9.     temp.fill(Qt::transparent);  
  10.     QPainter  painter(&temp);  
  11.     painter.setRenderHint(QPainter::SmoothPixmapTransform, true);  
  12.     painter.translate(imageWidth / 2, imageHeight / 2); //让图片的中心作为旋转的中心    
  13.     painter.rotate(rat); //顺时针旋转30度    
  14.     painter.translate(-(imageWidth / 2), -(imageHeight / 2)); //使原点复原    
  15.     painter.drawPixmap(0, 0, pix);  
  16.     painter.end();  
  17.     m_zeroUI.label_pointer->setPixmap(temp);  
  18. }  

转载地址:http://blog.csdn.net/qq_32250025/article/details/78346145
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT 中,可以通过 QTransform 类实现对控件的放大、缩小和旋转操作,通过 QDrag 类实现拖动操作。 首先,需要在控件的构造函数中开启鼠标跟踪功能: ```c++ setMouseTracking(true); ``` 然后,重载控件的鼠标事件函数,实现对鼠标事件的处理: ```c++ void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_lastPos = event->pos(); // 记录鼠标按下时的位置 } } void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 鼠标左键被按下 QPoint delta = event->pos() - m_lastPos; // 计算鼠标移动的距离 m_lastPos = event->pos(); // 记录当前鼠标位置 QTransform transform; transform.translate(delta.x(), delta.y()); // 平移控件 setTransform(transform * transform()); // 更新控件的变换矩阵 } } void MyWidget::wheelEvent(QWheelEvent *event) { QPoint delta = event->angleDelta(); // 获取鼠标滚轮滚动的距离 qreal scaleFactor = 1.0 + delta.y() / 1000.0; // 计算缩放比例 QTransform transform; transform.scale(scaleFactor, scaleFactor); // 缩放控件 setTransform(transform * transform()); // 更新控件的变换矩阵 } void MyWidget::mouseDoubleClickEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QTransform transform; transform.rotate(45); // 旋转控件 setTransform(transform * transform()); // 更新控件的变换矩阵 } } void MyWidget::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); } void MyWidget::dragMoveEvent(QDragMoveEvent *event) { event->acceptProposedAction(); } void MyWidget::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasUrls()) { QList<QUrl> urls = mimeData->urls(); if (urls.size() > 0) { QString fileName = urls.first().toLocalFile(); QPixmap pixmap(fileName); setPixmap(pixmap); // 在控件上显示图片 } } } ``` 在上述代码中,m_lastPos 是记录鼠标按下时的位置的成员变量,setTransform 函数可以设置控件的变换矩阵,transform 函数可以获取控件的变换矩阵。在鼠标事件函数中,通过计算鼠标移动的距离、计算缩放比例和旋转角度等,调用 QTransform 类的函数实现对控件的操作。在拖动操作中,需要重载 dragEnterEvent、dragMoveEvent 和 dropEvent 三个函数,其中 dragEnterEvent 和 dragMoveEvent 函数需要接受拖放事件,而 dropEvent 函数需要处理拖放完成后的操作,例如在控件上显示被拖拽的文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值