ToB企服应用市场:ToB评测及商务社交产业平台

标题: Qt实现海康OSD拖动Demo [打印本页]

作者: 农妇山泉一亩田    时间: 2025-1-11 08:10
标题: Qt实现海康OSD拖动Demo
在 Qt 中可以通过组合 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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4