QT 通过鼠标拖动实现框选

功能:QT 实现框选

QT 通过鼠标拖动实现框选

实现移动鼠标时,能够进行框选。需要三个鼠标事件,一个画图事件,用来画长方形
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);

画长方形需要记住左上角的点和长,宽,利用链表来记录点。当鼠标按下时,记录下第一个点,而当鼠标移动时,记录如果链表中只有一个点则将新的点加入,如果链表中已经有两个点了,需要将链表中的第二个点删除,将最新的点进行添加。

void Widget::mousePressEvent(QMouseEvent *event)
{
    if (m_dh_video != NULL) {     
        appendPoints(event->pos());
        printf("mousePressEvent \n");
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if (m_dh_video != NULL) {
        append(event->pos());
        update();
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
        append(event->pos());
        update();  // 启动paintEvent
       //  mouseReleaseAndControl();  // 在鼠标释放后调用快速定位的功能
        drawParamList.clear();

}
 void Widget::draw(QPainter& painter, QList<QPoint>& param)
 {
     if (param.count() >= 2) {
         int x = (param[0].x() < param[1].x()) ? param[0].x() : param[1].x();
         int y = (param[0].y() < param[1].y()) ? param[0].y() : param[1].y();
         int w = qAbs(param[0].x() - param[1].x()) + 1;
         int h = qAbs(param[0].y() - param[1].y()) + 1;
         painter.drawRect(x, y, w, h);  // 画长方形
     }
 }
 void Widget::paintEvent(QPaintEvent *event)
 {
     QPainter painter(this);
     painter.setPen(Qt::blue);
     draw(painter, drawParamList);  // 

 }
void Widget::appendPoints(QPoint p)
{
    if ( drawParamList.count() == 2 ) {
        drawParamList.removeLast(); // 移除最后一个点
    }
    drawParamList.append(p);
}
  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现QPlainTextEdit自定义拖动事件,可以采用以下步骤: 1. 继承QPlainTextEdit类,创建一个新类,例如MyPlainTextEdit。 2. 在新类中重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个函数。 3. 在mousePressEvent中记录起始位置,设置标志位表示框状态开始。 4. 在mouseMoveEvent中计算当前位置和起始位置的距离,根据距离绘制择框。 5. 在mouseReleaseEvent中结束框状态,清除择框。 下面是示例代码: ``` class MyPlainTextEdit : public QPlainTextEdit { Q_OBJECT public: MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) { setAcceptDrops(false); // 禁用默认的拖拽操作 setMouseTracking(true); // 开启鼠标移动追踪 } protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { startPos = event->pos(); endPos = startPos; selecting = true; } QPlainTextEdit::mousePressEvent(event); } void mouseMoveEvent(QMouseEvent *event) override { if (selecting) { endPos = event->pos(); update(); } QPlainTextEdit::mouseMoveEvent(event); } void mouseReleaseEvent(QMouseEvent *event) override { if (selecting) { endPos = event->pos(); selecting = false; update(); } QPlainTextEdit::mouseReleaseEvent(event); } void paintEvent(QPaintEvent *event) override { QPlainTextEdit::paintEvent(event); if (selecting) { QPainter painter(viewport()); painter.setPen(Qt::DashLine); painter.setBrush(QColor(200, 200, 200, 100)); QRect rect(startPos, endPos); painter.drawRect(rect.normalized()); } } private: bool selecting = false; QPoint startPos, endPos; }; ``` 在这个示例代码中,我们重写了鼠标事件处理函数,并且开启了鼠标移动追踪。当用户按下左键时,记录起始位置,设置标志位表示框状态开始;当用户移动鼠标时,计算当前位置和起始位置的距离,根据距离绘制择框;当用户释放鼠标时,结束框状态,清除择框。同时,我们还重写了paintEvent函数,在择状态下绘制择框。 使用这个自定义的QPlainTextEdit,用户就可以通过鼠标拖动择文本了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值