文章

Qt背景透明可拖动

Qt背景如何透明并且可拖动呢?

在头文件MainWindow类中声明变量:

private:
    //	声明一个变量用来存放位置坐标
    QPointF m_lastPos;
    //int TITLE_HEIGHT = 50;    //这里也可以使用宏定义,保存标题高度,也就是鼠标点击区域的高度


//	b.声明鼠标事件函数
protected:
    void  mouseMoveEvent(QMouseEvent *event) override;
    void  mousePressEvent(QMouseEvent *event) override;
    void  mouseReleaseEvent(QMouseEvent *event) override;
    void  paintEvent(QPaintEvent *e) override;

在cpp文件中添加相应代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //隐藏Windows窗口自带的标题栏
    this->setWindowFlag(Qt::FramelessWindowHint);
    //设置窗口背景透明
    this->setAttribute(Qt::WA_TranslucentBackground);
}

编写方法:

/*
	* 半透明遮罩 
*/
void MainWindow::paintEvent(QPaintEvent *e)
{
    //创建绘画对象
    QPainter painter(this);
    //为窗口添加一个半透明的矩形遮罩
    painter.fillRect(this->rect(), QColor(0, 0, 0, 150));
    QWidget::paintEvent(e);
}
/*

    * 鼠标按下操作
    * 记录当前坐标
*/
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    // if(event->y()<TITLE_HEIGHT)
    // {
    m_lastPos = event->globalPosition();
    // }
}
/*
 * 鼠标移动函数
 * 这里实时修改窗口的坐标
 */
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    // if(event->y()<TITLE_HEIGHT)
    // {
        int dx = event->globalPosition().x() - m_lastPos.x();
        int dy = event->globalPosition().y() - m_lastPos.y();
        m_lastPos = event->globalPosition();
        this->move(this->x()+dx,this->y()+dy);
    // }
}
/*
 * 鼠标释放函数
 */
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    // if(event->y()<TITLE_HEIGHT)
    // {
        int dx = event->globalPosition().x() - m_lastPos.x();
        int dy = event->globalPosition().y() - m_lastPos.y();
        this->move(this->x()+dx,this->y()+dy);
    // }
}

License:  CC BY 4.0