赞
踩
原文链接:https://blog.csdn.net/sinat_24206709/article/details/55805254
样式表给你无聊的Qt GUI增添了重味道。
很长一段时间,Qt已经允许你使用CSS’ish样式表来装饰你的GUI。 受网络启发,样式表是一个伟大的方式来风格化你的Qt GUI,但似乎很少有人使用它们。 在本教程中,我们将使用Designer和样式表在Qt中创建一个示例对话框。 本教程假设您可以在Qt Designer中解决,并且您了解一些关于Qt布局。
第一种方法:
ui->widget->setAutoFillBackground(true);
QPalette palette;
palette.setColor(QPalette::Background, QColor(0,0,0,150)); // 最后一项为透明度
//palette.setBrush(QPalette::Background, QBrush(QPixmap(":/background.png")));
ui->widget->setPalette(palette);
第二种方法(推荐):
this->setWindowFlags(Qt::FramelessWindowHint);//无标题栏
this->setAttribute(Qt::WA_TranslucentBackground,true); //设置背景透明
记住在主widget上多加一个widget打底。
原文链接:https://blog.csdn.net/Stone_OverLooking/article/details/111590068
之前在项目中有个需求:视频播放窗口电子放大功能,需要在播放视频的QWidget上绘制一个可以拖拽的矩形框,但是单独的drawRect并不能获得焦点去拖拽。于是乎就另外想到一个办法使用一个透明的
QWidget覆盖到该窗口上,将其背景设置为透明即可,但是设置透明之后,其底色的黑色无法消除,经多方CSDN博主的成果于一身,搞定了该需求。
其实就是这么几点:
设置背景透明
setWindowOpacity(1);
this->setAttribute(Qt::WA_TranslucentBackground, true);
在该窗口绘制一个矩形框,为画刷填充一个任意的颜色,重点:将其透明度降为不为0的数值即可。实现透明效果。
void AlargeShape::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(QColor(9,151,247,1));//painter区域全部的背景色
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
painter.drawRect(2, 2, end_pos.x()-X-4,end_pos.y()-Y-4);
}
源码:
#include <QFrame> class AlargeShape : public QFrame// QWidget { Q_OBJECT public: QWidget* widgetShape; explicit AlargeShape(QWidget *parent = nullptr); void paint(QPainter &painter); void setWidgetGeometry(QPoint point); signals: private: //设置鼠标拖动窗体时的状态 bool m_move ; /*记录鼠标的世界坐标.*/ QPoint m_startPoint ; /*记录窗体的世界坐标.*/ QPoint m_windowPoint ; private: //记录鼠标所在的位置 QPoint start_pos; QPoint end_pos; int X,Y; //记录父窗体所在的位置 QPoint parent_pos; int parent_width,parent_height; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event)override; void mouseReleaseEvent(QMouseEvent *event)override; void paintEvent(QPaintEvent *)override; public: void SetParentPos(QPoint pos,int w,int h) { parent_pos=pos; parent_width=w; parent_height=h; } void SetStartPos(const QPoint pos){start_pos=pos;} void SetEndPos(const QPoint pos){end_pos=pos;} };
#include "alargeshape.h" #include <QMouseEvent> #include <QPainter> #include <QDebug> #include <qpalette> AlargeShape::AlargeShape(QWidget *parent) //: QWidget(parent) { this->setWindowFlags(Qt::Tool| Qt::FramelessWindowHint|Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint); setObjectName("frameAlarge"); setWindowOpacity(1); this->setAttribute(Qt::WA_TranslucentBackground, true); } /************************************************************************ * @描述:改变当前窗口大小,在父窗体的paintEvent中调用 * @参数: * @返回: * @作者:zhontao * @时间:2020-12-23 14:57:57 ************************************************************************/ void AlargeShape::paint(QPainter &painter) { this->show(); this->resize(QSize(end_pos.x()-X,end_pos.y()-Y)); } void AlargeShape::setWidgetGeometry(QPoint point) { X=point.x(); Y=point.y(); this->setGeometry( point.x(), point.y(),0,0); } void AlargeShape::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(QColor(9,151,247,1));//painter区域全部的背景色 painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); painter.drawRect(2, 2, end_pos.x()-X-4,end_pos.y()-Y-4); } void AlargeShape::mousePressEvent(QMouseEvent *event) { /*当鼠标左键点击时.*/ if (event->button() == Qt::LeftButton) { m_move = true; /*记录鼠标的世界坐标.*/ m_startPoint = event->globalPos(); /*记录窗体的世界坐标.*/ m_windowPoint = this->frameGeometry().topLeft(); } } void AlargeShape::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { //计算父窗口的四个角点坐标 QPoint p_left_top=parent_pos; QPoint p_left_bottom=QPoint(parent_pos.x(),parent_pos.y()+parent_height); QPoint p_right_top=QPoint(parent_pos.x()+parent_width,parent_pos.y()); QPoint p_right_bottom=QPoint(parent_pos.x()+parent_width,parent_pos.y()+parent_height); // 局限矩形仅限于当前窗口内 // /*移动中的鼠标位置相对于初始位置的相对位置.*/ // QPoint relativePos = event->globalPos() - m_startPoint; if( ((event->globalPos().x()-p_left_top.x())-(m_startPoint.x()-m_windowPoint.x()) >=0 )&& ((event->globalPos().x()-p_right_top.x())-(m_startPoint.x()-(m_windowPoint.x()+this->width())) <=0 ) && ((event->globalPos().y()-p_left_top.y())-(m_startPoint.y()-m_windowPoint.y()) >=0)&& ((event->globalPos().y()-p_left_bottom.y())-(m_startPoint.y()-(m_windowPoint.y()+this->height())) <=0) ) { /*移动中的鼠标位置相对于初始位置的相对位置.*/ QPoint relativePos = event->globalPos() - m_startPoint; /*然后移动窗体即可.*/ this->move(m_windowPoint + relativePos ); } } } void AlargeShape::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { /*改变移动状态.*/ m_move = false; } }
效果图:
原文链接:https://blog.csdn.net/m0_60259116/article/details/127887533
在构造函数里添加代码,需要添加头文件qpalette或qgui
QPalette pal = palette();
pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00));
setPalette(pal);
通过设置窗体的背景色来实现,将背景色设置为全透。
效果: 窗口整体透明,但窗口控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏
setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
同样在构造函数中,效果和第一种方法相同。
原文链接:https://blog.csdn.net/u011832219/article/details/128183316
原文链接:https://blog.csdn.net/qq_39347787/article/details/130102515
原文链接:https://blog.csdn.net/HiWangWenBing/article/details/131750858
Qt提供了一种称为Qt样式表(Qt Style Sheets)的机制,可以用于自定义和美化Qt应用程序的用户界面(UI)。
使用Qt样式表,你可以通过类似CSS的语法来定义UI元素的外观和布局,包括颜色、字体、边框、背景等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。