Qt实现海康OSD拖动Demo

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

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

  • 使用 QLabel 显示文本。
  • 为 QLabel 启用鼠标事件,通过重写其 mousePressEvent, mouseMoveEvent 和 mouseReleaseEvent 实现拖动功能。
  • 将 QLabel 设置为窗口的子控件,限制它的移动范围在窗口内。
  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QLabel>
  4. #include <QMouseEvent>
  5. class DraggableLabel : public QLabel {
  6.     Q_OBJECT
  7. public:
  8.     explicit DraggableLabel(QWidget *parent = nullptr) : QLabel(parent), m_isDragging(false) {
  9.         setText("拖动我!");
  10.         setStyleSheet("background-color: lightblue; padding: 5px; border: 1px solid black;");
  11.         setAlignment(Qt::AlignCenter);
  12.         setFixedSize(100, 50);
  13.     }
  14. protected:
  15.     void mousePressEvent(QMouseEvent *event) override {
  16.         if (event->button() == Qt::LeftButton) {
  17.             m_isDragging = true;
  18.             m_dragStartPosition = event->pos();
  19.         }
  20.     }
  21.     void mouseMoveEvent(QMouseEvent *event) override {
  22.         if (m_isDragging) {
  23.             QPoint newPos = mapToParent(event->pos() - m_dragStartPosition);
  24.             QRect parentRect = parentWidget()->rect();
  25.             // 限制 QLabel 不超出父窗口范围
  26.             newPos.setX(qMax(parentRect.left(), qMin(newPos.x(), parentRect.right() - width())));
  27.             newPos.setY(qMax(parentRect.top(), qMin(newPos.y(), parentRect.bottom() - height())));
  28.             move(newPos);
  29.         }
  30.     }
  31.     void mouseReleaseEvent(QMouseEvent *event) override {
  32.         if (event->button() == Qt::LeftButton) {
  33.             m_isDragging = false;
  34.         }
  35.     }
  36. private:
  37.     bool m_isDragging;
  38.     QPoint m_dragStartPosition;
  39. };
  40. int main(int argc, char *argv[]) {
  41.     QApplication app(argc, argv);
  42.     QWidget window;
  43.     window.setWindowTitle("可拖动文本");
  44.     window.resize(400, 300);
  45.     DraggableLabel *label = new DraggableLabel(&window);
  46.     label->move(150, 125); // 初始位置
  47.     window.show();
  48.     return app.exec();
  49. }
  50. #include "main.moc"
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表