2021.1.19更新:全局透明(窗口+控件)、鼠标双击实现窗口最大化/还原
效果(懒得做动态图了,文章末尾自行下载项目模板直接编译运行即可。):
接口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实现更好看更美观更炫酷的界面效果。