Qt实现海康OSD拖动Demo

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

  1. 使用 QLabel 显示文本。
  2. QLabel 启用鼠标事件,通过重写其 mousePressEvent, mouseMoveEventmouseReleaseEvent 实现拖动功能。
  3. QLabel 设置为窗口的子控件,限制它的移动范围在窗口内。
cpp 复制代码
#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"
相关推荐
苏州IT威翰德5 小时前
苏州IT基础架构IQ/OQ/PQ确认服务 | 服务器网络验证
开发语言·php
Xin_ye100865 小时前
C# 零基础到精通教程 - WPF 专题二:数据绑定与 MVVM
开发语言·c#·wpf
我是一颗柠檬5 小时前
【Java后端技术亮点】Feed流三级缓存设计,从10秒到100毫秒的优化实战
java·开发语言·后端·缓存
兆。5 小时前
LangChain文档处理集成指南:面向知识管理开发者
开发语言·langchain·c#
Brilliantwxx5 小时前
【算法从零到千】【1-7】 双指针算法
开发语言·c++·笔记·算法·leetcode·推荐算法
雪的季节5 小时前
Qt 高性能绘图的核心原理
qt
Irissgwe5 小时前
一、Qt 概述
c++·qt·gui·qt creator
超梦dasgg5 小时前
Java 正则表达式 完整详解(语法 + 核心类 + 常用方法 + 实战案例)
java·开发语言·正则表达式
方也_arkling5 小时前
【Java-Day17】API篇-BigInteger和BigDecimal
java·开发语言
星辰_mya5 小时前
ThreadLocal之微服务链路追踪
java·开发语言·前端