A_de_kunbo_csdn 2018-12-17 14:20 采纳率: 0%
浏览 1053

QT 我想在主窗口(USB摄像头)widget上叠加一个透明的窗口,用来绘制图形,求各位大牛指点!!

目前在网上搜到了一些建议,主要是设置透明度,但是我试了之后,叠加完看不到上面的子窗口。代码如下:

    jiemian = new QGridLayout(this);
    p_ViewWidget = new ViewWidget(this);
    p_Widget = new Widget(this);
    p_ViewWidget->setWindowFlags(Qt::FramelessWindowHint);
    p_ViewWidget->setWindowOpacity(1);
    p_ViewWidget->setAttribute(Qt::WA_TranslucentBackground);


    jiemian->addWidget(p_Widget,0,0,1,1);
    jiemian->addWidget(p_ViewWidget,0,0,1,1);
    this->setLayout(jiemian);
    this->show();

希望能得到各位的建议!!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:42
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这篇博客也许可以解决你的问题👉 :如何在QT中将Qwidget类提升为USB(uvc)摄像头类的使用
    • 除此之外, 这篇博客: QT自定义Widget实现鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变中的 QT自定义Widget实现鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      通过setWindowFlags(Qt::FramelessWindowHint);可以隐藏掉Qt自带的窗口标题,这句话写的简单,可是窗口引起的改变可不少:

      • 最直观的,标题栏没了
      • 间接的,没了标题栏,也没有办法拖拽标题栏移动窗口位置了
      • 隐含的,鼠标移动到窗口边缘时,鼠标形态不再改变,无法实现鼠标拖拽窗口边缘改变窗口大小

      So,想使用自定义的窗体也是需要付出代价的。如果我既想自定义窗体,也想要让自定义的窗体,兼具鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变的特性呢,那就继续往下看吧。

      最新get到一个比较有趣的实现方式,想借着实现以上两个功能点来秀一哈。
      下面直接上代码:
      实现鼠标拖拽移动窗体的代码:

      /*MoveWgt.h*/
      #ifndef MOVEWGT_H
      #define MOVEWGT_H
      #include <QObject>
      #include <QWidget>
      #include <QMouseEvent>
      #define Move_Wgt                                                           \
      private:                                                                   \
      void mousePressEvent(QMouseEvent *event)                                   \
      {                                                                          \
          m_isPressed = true;                                                    \
          m_startMovePos = event->globalPos()-this->frameGeometry().topLeft();   \
      }                                                                          \
      void mouseMoveEvent(QMouseEvent *event)                                    \
      {                                                                          \
          if(m_isPressed)                                                        \
          {                                                                      \
              move(this->mapToGlobal(event->pos() - m_startMovePos));            \
          }                                                                      \
      }                                                                          \
      void mouseReleaseEvent(QMouseEvent *)                                      \
      {                                                                          \
          m_isPressed = false;                                                   \
      }                                                                          \
      private:                                                                   \
          bool m_isPressed = false;                                              \
          QPoint m_startMovePos;
      
      #endif // MOVEWGT_H
      

      实现拖拽改变窗体大小的代码:

      /*DragWgt.h*/
      #ifndef DRAGWGT1_H
      #define DRAGWGT1_H
      #include <QObject>
      #include <QWidget>
      #include <QMouseEvent>
      #include "Windows.h"
      #define Drag_Wgt                                                                          \
      bool nativeEvent(const QByteArray &eventType, void *message, long *result)                \
      {                                                                                         \
          MSG* pMsg = (MSG*)message;                                                            \
          switch (pMsg->message)                                                                \
          {                                                                                     \
          case WM_NCHITTEST:                                                                    \
          {                                                                                     \
              QPoint pos = mapFromGlobal(QPoint(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)));   \
              bool bHorLeft = pos.x() < g_nBorder;                                              \
              bool bHorRight = pos.x() > width() - g_nBorder;                                   \
              bool bVertTop = pos.y() < g_nBorder;                                              \
              bool bVertBottom = pos.y() > height() - g_nBorder;                                \
              if (bHorLeft && bVertTop)                                                         \
              {                                                                                 \
                  *result = HTTOPLEFT;                                                          \
              }                                                                                 \
              else if (bHorLeft && bVertBottom)                                                 \
              {                                                                                 \
                  *result = HTBOTTOMLEFT;                                                       \
              }                                                                                 \
              else if (bHorRight && bVertTop)                                                   \
              {                                                                                 \
                  *result = HTTOPRIGHT;                                                         \
              }                                                                                 \
              else if (bHorRight && bVertBottom)                                                \
              {                                                                                 \
                  *result = HTBOTTOMRIGHT;                                                      \
              }                                                                                 \
              else if (bHorLeft)                                                                \
              {                                                                                 \
                  *result = HTLEFT;                                                             \
              }                                                                                 \
              else if (bHorRight)                                                               \
              {                                                                                 \
                  *result = HTRIGHT;                                                            \
              }                                                                                 \
              else if (bVertTop)                                                                \
              {                                                                                 \
                  *result = HTTOP;                                                              \
              }                                                                                 \
              else if (bVertBottom)                                                             \
              {                                                                                 \
                  *result = HTBOTTOM;                                                           \
              }                                                                                 \
              else                                                                              \
              {                                                                                 \
                  return false;                                                                 \
              }                                                                                 \
              return true;                                                                      \
          }                                                                                     \
              break;                                                                            \
          default:                                                                              \
              break;                                                                            \
          }                                                                                     \
          return QWidget::nativeEvent(eventType, message, result);                              \
      }                                                                                         \
      private:                                                                                  \
          int g_nBorder = 4;
      
      #endif // DRAGWGT_H
      
      

      咋用到程序里面呢?直接上代码:

      #ifndef TESTWGT_H
      #define TESTWGT_H
      
      #include <QWidget>
      #include "movewgt.h"
      #include "dragwgt.h"
      
      namespace Ui {
      class TestWgt;
      }
      
      class TestWgt : public QWidget
      {
          Q_OBJECT
          
          //对的,就是这两行代码,其他的请略过
          Move_Wgt//-------------实现窗体鼠标按住拖拽可移动
          Drag_Wgt//-------------实现鼠标拖拽边缘窗体大小改变
          
      public:
          explicit TestWgt(QWidget *parent = nullptr);
          ~TestWgt();
      
      private:
          Ui::TestWgt *ui;
      };
      
      #endif // TESTWGT_H
      

      注意奥,因为在MoveWgt.h中已经定义过 mousePressEvent、 mouseMoveEvent、 mouseReleaseEvent三个函数,所以在TestWgt中不能再重写该函数,否则编译会出现函数重定义的问题,DragWgt.h文件中相同。如果在自己的类中有需要重写以上函数的需要,可以不采用宏导入的这种方式,功能的实现方式不变,具体的就不在此赘述了。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算