美文网首页
Qt实现透明窗口通过鼠标画线

Qt实现透明窗口通过鼠标画线

作者: mingyuan0702 | 来源:发表于2019-10-15 13:33 被阅读0次

最近公司项目中有一个需求,要在视频播放窗口上自由绘制图形。经过研究可以通过在视频播放窗口上添加一个顶层透明的窗口,在透明窗口上直接绘图的方式实现。

1.绘图采用QGraphicsView控件,添加QGraphicsScene的方式,代码中只是简单的画线,可以扩展画矩形、圆形、文字等,另外这种方式还可以对绘制的图形做翻转、缩放等操作,方便简单

2.代码中包含图像清除功能,透明窗口的清除不能像白板似的改变线的颜色就能实现

3.支持mac和windows,这两种系统在设置透明的时候稍微有些差别,代码中有说明,可以试一下

image.png
#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QMouseEvent>

#include <QPaintEvent>

#include <QGraphicsScene>

#include <QGraphicsView>

#include <QPen>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

protected:

    void mousePressEvent(QMouseEvent *event);

    void mouseMoveEvent(QMouseEvent *event);

    void mouseReleaseEvent(QMouseEvent *event);

    void paintEvent(QPaintEvent *event);

private:

    Ui::Widget *ui;

    QGraphicsView *m_graphicsView;

    QGraphicsScene *m_scene;

    QPoint m_pStart;

    QPen m_pen;

    bool m_isPressed;

};

#endif // WIDGET_H
#include "widget.h"

#include "ui_widget.h"

#include <QPainter>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget),

    m_isPressed(false)

{

    ui->setupUi(this);

    //设置无边界窗口并置顶

    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

    setMouseTracking(true);

    //窗口设置透明

    setAttribute(Qt::WA_TranslucentBackground,true);

    setFixedSize(500,500);

    m_graphicsView = new QGraphicsView(this);

    //设置鼠标穿透效果

    m_graphicsView->setAttribute(Qt::WA_TransparentForMouseEvents);

    m_graphicsView->setStyleSheet("background:transparent;");

    m_graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    m_graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    m_graphicsView->setGeometry(0,0,width(),height());

    m_graphicsView->show();

    //设置绘图场景

    m_scene = new QGraphicsScene();

    m_graphicsView->setScene(m_scene);

    m_graphicsView->setSceneRect(0,0,width(),height());

    m_pen.setStyle(Qt::SolidLine);

    m_pen.setColor(Qt::red);

    m_pen.setWidth(3);

    move(0,0);

}

Widget::~Widget()

{

    delete ui;

    delete m_graphicsView;

}

void Widget::mousePressEvent(QMouseEvent *event)

{

    m_isPressed = true;

    m_pStart = event->pos();

}

void Widget::mouseMoveEvent(QMouseEvent *event)

{

    if(m_isPressed){

        QPoint pt = event->pos();

//        清除绘制内容(橡皮擦功能)

//        QTransform transform;

//        QGraphicsItem *item = m_scene->itemAt(pt,transform);

//        if(item){

//            m_scene->removeItem(item);

//        }

        //绘制图像

        m_scene->addLine(m_pStart.x(),m_pStart.y(),pt.x(),pt.y(),m_pen);

        m_pStart = pt;

    }

}

void Widget::mouseReleaseEvent(QMouseEvent *event)

{

    m_isPressed = false;

}

void Widget::paintEvent(QPaintEvent *event)

{

    QPainter painter(this);

#ifdef WIN32

    painter.fillRect(this->rect(), QColor(255, 255, 255, 1));

#else

    //mac电脑上需要将透明度设置为15,小于15鼠标控制画不上,15是临界值,是根据测试得来的,没有具体研究

    painter.fillRect(this->rect(), QColor(255, 255, 255, 15));

#endif

}

相关文章

  • Qt实现透明窗口通过鼠标画线

    最近公司项目中有一个需求,要在视频播放窗口上自由绘制图形。经过研究可以通过在视频播放窗口上添加一个顶层透明的窗口,...

  • Qt窗口透明

    1.Widget无边框,窗口透明: 2.Dialog无边框,窗口透明: 3.QQuickWidget窗口透明: 在...

  • macOS 之 Moom

    一、功能 Moom 可以通过鼠标点击或快捷键实现窗口管理;通过 Moom, 你可以很容易将窗口移动 (Move) ...

  • 将外部程序嵌入qt

    网上搜了下实现方案,原理很简单,就是通过获取外部窗口的id,转换为QWindow嵌入当前qt窗口。于是问题就变成了...

  • Qt透明无边框窗口

    文章介绍如何设置窗口透明,无边框和拖动。 0x00 如何透明窗口?   第一步:开启窗口的透明层。   第二步: ...

  • Qt 设置鼠标光标的形状

    Qt 提供了两种用于控制鼠标光标形状的机制: 当鼠标悬停在某个特殊的窗口部件上时,QWidget::setCurs...

  • CSS图片透明度

    opacity属性 利用opacity属性实现图片透明 hover属性 利用hover属性实现鼠标滑过,改变透明度...

  • Qt随笔 - 窗口及其控件透明

    想要做一个像 Word 里面可以半透明的悬停窗口 网上扒了半天,终于找到解决方法了。 就是它! 官方说法: 这个l...

  • JavaScript和HTML的交互是通过事件实现的。而事件是某个行为或者触发,比如点击、鼠标移动、滚动窗口、键盘...

  • 自动翻译器2

    自动翻译器的qt部分 接下来我们要实现qt窗口部分,这里遇到一个很尴尬的事情,qt for python的开发环境...

网友评论

      本文标题:Qt实现透明窗口通过鼠标画线

      本文链接:https://www.haomeiwen.com/subject/nnnzectx.html