Qt无边框、窗口透明、控件透明、拖动、缩放,简单项目模板2.0

说明

1.0地址

2.0特点

1、使用mainWindow的工具栏作为窗口的标题栏,显示标题,加入帮助、最大/小化、还原、关闭等功能按钮。
2、拖动窗口方式由右键在窗口内任意位置按下拖动改为左键在标题栏区域内按下拖动。
3、双击标题栏可最大化/还原窗口。
4、使用F1F2F3等按键调整窗口属性,如窗口透明度、窗口颜色、最小化、显示工具栏。
在这里插入图片描述
在这里插入图片描述

部分代码描述

1、双击最大化/还原窗口大小

void MainWindow::mouseDoubleClickEvent(QMouseEvent *mouseDoubleClick)
{

    QPoint ClickPoint = mouseDoubleClick->pos();
    QRect toolBarRect = ui->toolBar->rect();  //工具栏矩形
    if(toolBarRect.contains(ClickPoint))
    {
        if(windowState() == Qt::WindowMaximized)
        {
            setWindowState(Qt::WindowNoState);
        }
        else
        {
            setWindowState(Qt::WindowMaximized);
        }
    }
}

2、标题栏左键拖动窗口

void MainWindow::mousePressEvent(QMouseEvent *mousePress)
{
    //mousePress->pos()为鼠标在当前窗口坐标系的坐标,在窗口坐标系中,窗口左上角坐标为(0,0)
    pressPoint = mousePress->pos();
    if(mousePress->button() == Qt::LeftButton)
    {
        pressMouseButton = Qt::LeftButton;
    }
    else
    {
        pressMouseButton = Qt::NoButton;
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *mouseMove)
{
    QRect toolBarRect = ui->toolBar->rect();  //工具栏矩形
    if(toolBarRect.contains(pressPoint))
    {
        //限制为左键按下时才可以拖动
        if(pressMouseButton == Qt::LeftButton)
        {
            /* 移动窗口时以左上角为基点。减去偏移量(鼠标在窗口坐标系中的坐标),使得鼠标移动时保持窗口和鼠标的相对位置不变 */
            move(mouseMove->globalPos() - pressPoint);
        }
    }
}

3、按键功能,调整窗口透明度、窗口颜色、最小化窗口、显示工具栏等

void MainWindow::keyPressEvent(QKeyEvent *keyPress)
{
    switch (keyPress->key())
    {
        case Qt::Key_F1:
        {
            float Opacity = windowOpacity() + 0.05;
            if(Opacity <= 1)
            {
                setWindowOpacity(Opacity);
                ui->statusbar->showMessage("透明度 " + QString::number(Opacity));
            }
            else
            {
                setWindowOpacity(1);
                ui->statusbar->showMessage("透明度 1");
            }
            break;
        }
        case Qt::Key_F2:
        {
            float Opacity = windowOpacity() - 0.05;
            if(Opacity >= 0)
            {
                setWindowOpacity(Opacity);
                ui->statusbar->showMessage("透明度 " + QString::number(Opacity));
            }
            else
            {
                setWindowOpacity(0);
                ui->statusbar->showMessage("透明度 0");
            }
            break;
        }
        case Qt::Key_F3:
        {
            QColorDialog selectColor;
            selectColor.setWindowFlags(Qt::WindowStaysOnTopHint);   //窗口置顶
            selectColor.setOption(QColorDialog::ShowAlphaChannel);  //允许设置Alpha透明度
            selectColor.exec();
            if(selectColor.result() == QColorDialog::Accepted)
            {
                bgColor = selectColor.currentColor();
            }
            else
            {
                qDebug()<<"error color.";
            }
            break;  //QColorDialog关闭后自动触发paintEvent,此处无需主动update()
        }
        case Qt::Key_F4:{setWindowState(Qt::WindowMinimized); break;}
        case Qt::Key_F5:{ui->toolBar->show(); break;}
        case Qt::Key_Escape:
        {
            quitMbox.exec();
            if(quitMbox.result() == QMessageBox::Yes)
            {
                this->close();
            }
            break;
        }
        //添加更多的key以完成其他功能
        default: break;
    }
}

4、其他

请参考下方源码或1.0描述

源码下载地址

Qt无边框、窗口透明、控件透明、拖动、缩放,简单项目模板2.0


版权声明:本文为wwplh5520370原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。