窗口透明
窗口整体透明(包含其子空控件)
//窗口以及子控件都透明
//setAttribute(Qt::WA_WState_WindowOpacitySet);
//网上说直接设置不起作用,需要加这个属性,但是我测试直接使用下面函数没问题
setWindowOpacity(0.7);
窗口半透明+paintEvent方式
- 窗体透明设置
设置窗口全透明,需要setWindowFlags不然会有黑色底色
/*全透明窗口,子控件不透明*/
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
//设置背景色透明(透明的部分,鼠标点击,鼠标信号会透传到z轴底层去)
setAttribute(Qt::WA_TranslucentBackground,true);
- 在paintEvent中绘制Rect(我绘制的是圆角矩形)
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter p(this); // 创建QPainter一个对象
p.setRenderHint(QPainter::Antialiasing);
p.setBrush(QBrush(QColor(97,111,118,150)));
p.setPen(Qt::transparent);
QRect rect = this->rect();
p.drawRoundedRect(rect,15,15);
QWidget::paintEvent(event);
}
可以看到这种方式Button子空间并没有透明,如果需要子控件也透明需要在第一部分代码之后调用setWindowOpacity设置透明度,然后paintEvent中的QBrush不设置透明度
样式表实现半透明
直接上代码吧,懒得打字了
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground,true);
setStyleSheet("border:none; background-color:rgba(0,0,255,150)");
}
void MainWindow::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
QStyleOption StyleOpt;
StyleOpt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget,&StyleOpt,&p,this);
}
无边框窗口的移动问题
如果我们将窗口设置为无边框之后(透明第二部分,Qt::FramelessWindowHint)那么我们的窗口是无法使用鼠标拖动的,就像上面的第二个圆角巨型窗口,解决方式也很简单,重写mouseevent相关函数就可以了
virtual void mousePressEvent(QMouseEvent * event) override;
virtual void mouseMoveEvent(QMouseEvent * event) override;
virtual void mouseReleaseEvent(QMouseEvent * event) override;
void MainWindow::mousePressEvent(QMouseEvent *event)
{
QMainWindow::mousePressEvent(event);
if(nullptr == event)
return ;
if(event->button() == Qt::LeftButton)
{
isDragging = true;
mouse_startPoint = event->globalPos() ;
window_top_left_point = this->frameGeometry().topLeft();
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
QMainWindow::mouseMoveEvent(event);
if(nullptr == event)
{
return ;
}
if(isDragging)
{
QPoint distence = event->globalPos() - mouse_startPoint;
this->move(window_top_left_point + distence);
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
QMainWindow::mouseReleaseEvent(event);
if(nullptr == event)
return;
if(event->button() == Qt::LeftButton)
isDragging = false ;
}
实际应用
有了以上趁热打铁用的使用的东西练练手,不得不说不对比以前用VC++做异形窗口的时候,步骤是多么繁琐QT,做界面就是方便快捷
异形窗口 (并非真正的异形窗口)
这是主窗口的函数,bgPix是一个QPixMap类型,用来绘制图片,首先设置了窗口的大小,然后设置窗口透明属性
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setFixedSize(626,626);
this->setWindowFlag(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
bgPix.load("://Resource/background.png");
bgPix = bgPix.scaled(size());
}
以上代码,设置窗口大小,bgpix加载图片资源,然后调用scaled函数缩放到窗体大小
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter p(this);
p.drawPixmap(0,0,bgPix);
}