Qt透明无边框窗口的实现示例
最近在封装一些类的时候,打算做一个窗口框架,能实现拖动、无边框、透明基本样式等功能
0x00如何透明窗口?
第一步:开启窗口的透明层。
setWindowFlags(Qt::FramelessWindowHint);/*注意:如果单纯开启窗口透明层效果,在Windows系统中必须设置,其他系统可忽略。*/ setAttribute(Qt::WA_TranslucentBackground);
第二步:重写paintEvent事件并使用QPainter画透明层。
voidpaintEvent(QPaintEvent*) { QPainterpainter(this); /*0x20为透明层颜色,可自定义设置为0x0到0xff*/ painter.fillRect(this->rect(),QColor(0,0,0,0x20)); }
0x01如何无边框窗口?
设置setWindowFlags(Qt::FramelessWindowHint);即可无边框窗口,但无法移动和改变大小。
0x02如何拖拽窗口?
由于系统窗口被设置为Qt::FramelessWindowHint会导致窗口不能被拖动。通过捕获鼠标移动事件从而实现窗口移动。
voidmousePressEvent(QMouseEvent*event) { if(event->button()==Qt::LeftButton){ /*捕获按下时坐标*/ m_startPoint=frameGeometry().topLeft()-event->globalPos(); } } voidmouseMoveEvent(QMouseEvent*event) { /*移动窗口*/ this->move(event->globalPos()+m_startPoint); }
0x03完整代码
#include#include #include #include #include classTransparentWidget:publicQWidget { Q_OBJECT public: TransparentWidget(QWidget*parent=0) :QWidget(parent) { setWindowTitle(QString::fromLocal8Bit("透明无边框窗口")); setFixedSize(480,320); setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); QPushButton*button=newQPushButton("Helloworld!",this); button->setGeometry(5,5,80,40); } voidpaintEvent(QPaintEvent*) { QPainterpainter(this); painter.fillRect(this->rect(),QColor(0,0,0,0x20));/*设置透明颜色*/ } voidmousePressEvent(QMouseEvent*event) { if(event->button()==Qt::LeftButton){ m_startPoint=frameGeometry().topLeft()-event->globalPos(); } } voidmouseMoveEvent(QMouseEvent*event) { this->move(event->globalPos()+m_startPoint); } private: QPointm_startPoint; };
0x04源码地址
https://github.com/aeagean/QtCustomWidget
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。