QT控件拖动放大缩小问题

前提:使用ui布局如下。中间带图片的是一个QLabel控件,用来显示图片。图片根据窗口控件大小保持横纵比放大缩小后输入QLabel显示

 问题点:程序运行起来后,鼠标拖动。中间的QLabel控件只能放大无法缩小(只能到图片大小)

 处理方法: 修改sizePolicy属性,水平策略跟垂直策略改为ignored

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 函数需要处理拖放完成后的操作,例如在控件上显示被拖拽的文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值