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

Qt无边框、透明、拖动、缩放,简单项目模板

  • 实现方式:键盘事件+鼠标事件+painter
    • 无边框效果
    • 透明效果
    • 拖动
    • 缩放
    • 颜色调整
    • 鼠标双击最大化/还原窗口
    • 扩展
    • 代码文件

实现方式:键盘事件+鼠标事件+painter

2021.1.19更新:全局透明(窗口+控件)、鼠标双击实现窗口最大化/还原
效果(懒得做动态图了,文章末尾自行下载项目模板直接编译运行即可。):
Qt无边框、窗口透明、控件透明、拖动、缩放,简单项目模板1.0_第1张图片

无边框效果

接口1:

void QWidget::setWindowFlags(Qt::WindowFlags type)

参数

Qt::FramelessWindowHint | windowFlags()

该接口可同时设置多种效果,比如无边框+置顶,参数可设置为:

Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint

接口2:

void QWidget::setWindowFlag(Qt::WindowType flag, bool on = true)

参数:

Qt::FramelessWindowHint

透明效果

方法一:窗口透明,控件不透明
接口:

void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on = true)

参数:

Qt::WA_TranslucentBackground

方法二:全局透明(窗口+控件)
接口:

void QWidget::setWindowOpacity(qreal level)

参数:0.0~1.0,0=全透明,1=不透明。

拖动

利用mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个事件实现。设置为鼠标右键按下时可拖动窗口调整位置,设置为左键拖动时与窗口缩放会有冲突(缩放窗口时,窗口位置对应产生变化)。

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

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

void MainWindow::mouseReleaseEvent(QMouseEvent *mouseRelease)
{
    pressMouseButton = Qt::NoButton;
}

缩放

项目模板为QMainWindow,右下角自带缩放。

颜色调整

keyPressEvent + paintEvent实现背景颜色调整。其中keyPressEvent 实现F1最小化窗口、F2最大化窗口、F3选择背景颜色,颜色对话框中alpha颜色通道调整透明度。

void MainWindow::keyPressEvent(QKeyEvent *keyPress)
{
    switch (keyPress->key())
    {
        case Qt::Key_F1:{setWindowState(Qt::WindowMinimized); break;}
        case Qt::Key_F2:{setWindowState(Qt::WindowMaximized); break;}
        case Qt::Key_F3:
        {
            QColorDialog selectColor;
            selectColor.setWindowFlags(Qt::WindowStaysOnTopHint);
            selectColor.setOption(QColorDialog::ShowAlphaChannel);
            selectColor.exec();
            if(selectColor.result() == QColorDialog::Accepted)
            {
                bgColor = selectColor.currentColor();
            }
            else
            {
                qDebug()<<"error color.";
            }
            break;  //QColorDialog关闭后自动触发paintEvent,此处无需主动update()
        }
        case Qt::Key_Escape:
        {
            quitMbox.exec();
            if(quitMbox.result() == QMessageBox::Yes)
            {
                this->close();
            }
            break;
        }
        //添加更多的key以完成其他功能
        default: break;
    }
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.fillRect(rect(), bgColor);
}

鼠标双击最大化/还原窗口

void MainWindow::mouseDoubleClickEvent(QMouseEvent *)
{
    if(windowState() == Qt::WindowMaximized)
    {
        setWindowState(Qt::WindowNoState);
    }
    else
    {
        setWindowState(Qt::WindowMaximized);
    }
}

扩展

可利用QSS和painter实现更好看更美观更炫酷的界面效果。

代码文件

直接去我的资源下载即可,无需积分。有问题或者建议、bug等,欢迎留言反馈,一起交流学习。
Qt无边框、窗口透明、控件透明、拖动、缩放,简单项目模板1.0_第2张图片

你可能感兴趣的:(QT,经验分享,qt5,界面设计)