当前位置: 首页 > article >正文

Qt实现海康OSD拖动Demo

在 Qt 中可以通过组合 QLabel 和鼠标事件来实现这个需求。以下是一个简单的实现步骤:

  1. 使用 QLabel 显示文本。
  2. QLabel 启用鼠标事件,通过重写其 mousePressEvent, mouseMoveEventmouseReleaseEvent 实现拖动功能。
  3. QLabel 设置为窗口的子控件,限制它的移动范围在窗口内。
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>

class DraggableLabel : public QLabel {
    Q_OBJECT

public:
    explicit DraggableLabel(QWidget *parent = nullptr) : QLabel(parent), m_isDragging(false) {
        setText("拖动我!");
        setStyleSheet("background-color: lightblue; padding: 5px; border: 1px solid black;");
        setAlignment(Qt::AlignCenter);
        setFixedSize(100, 50);
    }

protected:
    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            m_isDragging = true;
            m_dragStartPosition = event->pos();
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        if (m_isDragging) {
            QPoint newPos = mapToParent(event->pos() - m_dragStartPosition);
            QRect parentRect = parentWidget()->rect();

            // 限制 QLabel 不超出父窗口范围
            newPos.setX(qMax(parentRect.left(), qMin(newPos.x(), parentRect.right() - width())));
            newPos.setY(qMax(parentRect.top(), qMin(newPos.y(), parentRect.bottom() - height())));

            move(newPos);
        }
    }

    void mouseReleaseEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            m_isDragging = false;
        }
    }

private:
    bool m_isDragging;
    QPoint m_dragStartPosition;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    window.setWindowTitle("可拖动文本");
    window.resize(400, 300);

    DraggableLabel *label = new DraggableLabel(&window);
    label->move(150, 125); // 初始位置

    window.show();
    return app.exec();
}

#include "main.moc"


http://www.kler.cn/a/488916.html

相关文章:

  • 基于Springboot + vue实现的办公用品管理系统
  • EasyExcel的应用
  • IOS HTTPS代理抓包工具使用教程
  • 代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ
  • Taro+Vue实现图片裁剪组件
  • uml活动图和用例图之间有一致性要求吗
  • 阿里巴巴1688 API接口深度解析:商品详情获取与按图搜索商品(拍立淘)实用指南
  • Python使用pip安装Caused by SSLError:certificate verify failed
  • 【DNS 阿里云,域名解析,解析到IP的指定端口】
  • Three.js 渲染技术:打造逼真3D体验的幕后功臣
  • 新能源网站提升用户体验的关键
  • 字节小米等后端岗位C++面试题
  • 音视频入门基础:RTP专题(1)——RTP官方文档下载
  • linux创建服务,实现程序异常退出自启
  • npm发布流程说明
  • 创建和管理表
  • Vue3的reactive、ref、toRefs、toRef、toRaw 和 markRaw处理响应式数据区别
  • 科技盛宴CES Asia 2025,企业创新活力尽显
  • uniapp路由跳转+二级页面详情跳转保留当前页方法教程
  • Win11远程桌面怎么设置?
  • CAS操作的底层原理(总线锁定机制和缓存锁定机制 )
  • SpringBoot 原理篇(day14)
  • 【python自写包模块的标准化方法】
  • 「sql之窗口函数」
  • MongoDB中的索引是提高查询效率的重要工具
  • win32汇编环境,窗口程序中对按钮控件常用操作的示例