文章目录
半透明通知窗口
(1)工具栏(隐藏任务栏图标)窗体置顶 隐藏标题栏
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
(2)背景设透明
两种方法
//1.窗体、子控件、标题栏全都改变
setWindowOpacity(0.5);
//2.只改变窗体区域,标题栏、子控件不改变
setAttribute(Qt::WA_TranslucentBackground, true);
(3)圆角窗体
1.paintEvent重绘。窗体取消标题栏和设置透明后,可以在paintEvent里绘制一个窗体大小圆角矩形,就是圆角效果了。
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;
//QColor 第4个值设置透明度,0-255
painter.setBrush(QBrush(QColor(124,194,255,120)));
painter.setPen(Qt::transparent);
QRect rect = this->rect();
rect.setWidth(rect.width() - 1);
rect.setHeight(rect.height() - 1);
painter.drawRoundedRect(rect, 15, 15);
}
//也可用QPainterPath 绘制代替 painter.drawRoundedRect();
QPainterPath painterPath;
painterPath.addRoundedRect(rect, 15, 15);
painter.drawPath(painterPath);
通过此方式也可以实现气泡对话窗体的效果,就是绘制其它一些形状
2.设置样式表
setStyleSheet("QWidget{background-color:gray;border-top-left-radius:25px;border-top-right-radius:25px;"
"border-bottom-left-radius:25px;border-bottom-right-radius:25px}");
以上两种方式并没有改变窗体的形状,只是让一部分变得不可见,不同于设置窗体遮罩。
//设置窗体为圆角
QBitmap bmp(this->size());
bmp.fill();
QPainter p(&bmp);
p.setPen(Qt::NoPen);
p.setBrush(Qt::black);
p.drawRoundedRect(bmp.rect(),10,10);
setMask(bmp);
(4)阴影效果
QGraphicsDropShadowEffect
类提供了图形元素的阴影效果,用于增加立体感。
主要设置函数有3个,setColor()
用于设定阴影的颜色,setBlurRadius()
用于设定阴影的模糊度,
setOffset (qreal dx,qreal dy)
用于设定在哪个方向产生阴影效果,如果dx为负数,则阴影在图形元素的左边
#include <QGraphicsDropShadowEffect>
在前面圆角窗体的基础上,绘制的矩形设置稍小于窗体大小,留出显示阴影的空间
//比原来窗口小一点
int SHADOW_WIDTH=25;
QRect rect = this->rect().adjusted(SHADOW_WIDTH, SHADOW_WIDTH, -SHADOW_WIDTH, -SHADOW_WIDTH);
设置阴影
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//设置阴影偏移 (0,0)就是均匀一圈
shadow->setOffset(15, 15);
//设置阴影颜色
shadow->setColor(QColor("#444444"));
//设置阴影模糊程度,值越大越浅
shadow->setBlurRadius(25);
//给嵌套QWidget设置阴影
setGraphicsEffect(shadow);
Qt之使用QGraphicsDropShadowEffect添加窗口边框以及文字阴影效果
(5)根据QString长度自动设置窗体大小
1.QString 用length()返回字符串的长度,即字节数。
在中英文字符都是以 Unicode 方式编码的,所以,无论中英文都算的长度为 1。
想要取得英文长度为 1 中文长度为 2 的总长度,必须用toLocal8bit()。具体使用方法如下所示:
QString s = "ab中文";
int length = s.length(); //length = 4;
length = s.toLocal8Bit().length(); //length = 6
2.以上都是获取的字符串字节的长度,但是如果要在屏幕上显示,应获取所占的像素个数,
QFont wordfont;
wordfont.setFamily("宋体");
wordfont.setPointSize(10);
QFontMetrics fm(wordfont);
m_pLabel->setText("测试测试abc");
QRect rec = fm.boundingRect( m_pLabel->text());
int ii = rec.width();//这个就获得了字符串所占的像素宽度
(6)出现后计时,时间到消失或点击时消失
时间到后执行的槽函数和mousePressEvent()中调用close()
关闭窗口
注意:close()只会关闭窗口部件,不会结束主程序QApplication a(argc, argv),要结束主程序得用quit()
完整代码
h文件
#ifndef HINTBOX_H
#define HINTBOX_H
#include <QMainWindow>
#include <QTimer>
#include <QLabel>
#include <QPainter>
#include <QGraphicsEffect>
#include <QGraphicsDropShadowEffect>
#include <QMouseEvent>
class HintBox : public QMainWindow
{
Q_OBJECT
public:
HintBox(QWidget *parent = 0);
QTimer *timer;
QLabel *textLabel;
QFont *textFont;
int leftPadding,topPadding;
int hintX,hintY;
~HintBox();
void setHint(QString text,int time);
void setPosition(int,int);
protected:
virtual void paintEvent(QPaintEvent *);
virtual void mousePressEvent(QMouseEvent *);
private slots:
void timerSlot();
};
#endif // HINTBOX_H
cpp文件
#include "hintbox.h"
HintBox::HintBox(QWidget *parent)
: QMainWindow(parent)
{
//工具栏(隐藏任务栏图标)窗体置顶 隐藏标题栏
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
//setWindowOpacity(0.5); //包括子控件都变透明
setAttribute(Qt::WA_TranslucentBackground, true);//只是窗体变透明
//样式表实现圆角窗口
// setStyleSheet("QWidget{background-color:gray;border-top-left-radius:25px;border-top-right-radius:25px;"
// "border-bottom-left-radius:25px;border-bottom-right-radius:25px}");
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//设置阴影偏移 (0,0)就是均匀一圈
shadow->setOffset(0, 0);
//设置阴影颜色
shadow->setColor(QColor("#444444"));
//设置阴影模糊程度,值越大越浅
shadow->setBlurRadius(25);
//给嵌套QWidget设置阴影
setGraphicsEffect(shadow);
hintX=830;hintY=150;
setGeometry(hintX,hintY,260,100);
//显示文字的label
textLabel = new QLabel(this);
leftPadding=15;topPadding=20; //textLabel与窗体边界的间距
//设置字体
textFont = new QFont;
textFont->setFamily("黑体");
textFont->setPointSize(30);
textFont->setWeight(QFont::DemiBold);
textLabel->setFont(*textFont);
//颜色
textLabel->setStyleSheet("color:#FFFFFF;");
timer=new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(timerSlot()));
setHint("测试abc",2000);
}
void HintBox::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;
//QColor 第4个值设置透明度,0-255
painter.setBrush(QBrush(QColor(124,194,255,120)));
painter.setPen(Qt::transparent);
//比原来窗口小一点
int SHADOW_WIDTH=10;
QRect rect = this->rect().adjusted(SHADOW_WIDTH, SHADOW_WIDTH, -SHADOW_WIDTH, -SHADOW_WIDTH);
rect.setWidth(rect.width() - 1);
rect.setHeight(rect.height() - 1);
painter.drawRoundedRect(rect, 12, 12);
}
void HintBox::setPosition(int x,int y)
{
hintX=x;hintY=y;
this->setGeometry(hintX,hintY,width(),height());
}
void HintBox::setHint(QString text,int time)
{
textLabel->setText(text);
QFontMetrics fm(*textFont);
//获取QString的像素大小
QRect rectText = fm.boundingRect(textLabel->text());
//重设label和窗体大小
textLabel->setGeometry(leftPadding,topPadding,rectText.width(),rectText.height());
this->setGeometry(hintX,hintY,rectText.width()+50,100);
//定时显示后消失
timer->setInterval(time);
timer->start();
}
void HintBox::timerSlot()
{
close();
}
void HintBox::mousePressEvent(QMouseEvent *e)
{
if(e->button()== Qt::LeftButton)
{
hide();
}
}
HintBox::~HintBox()
{
}
自制标题栏
[使用]
头文件中添加
#include <QMessageBox>
#include "titlebar.h"
void closeEvent(QCloseEvent *event); // Overloaded function
设置任务栏图标和取消原标题栏
setWindowIcon(QIcon(":/images/star.ico"));//设置任务栏图标
setWindowFlags(Qt::FramelessWindowHint);
//setFixedSize(400,300); //如果固定窗口大小,最大化、最小化失效
实例化一个TitleBar,设置图标路径,标题,宽度
TitleBar* tBar =new TitleBar(this);
//默认位置就在(0,0),所以不用设置
tBar->setTitleBar(":/images/star.png","Eye_Track",width());
重写closeEvent
void MainWindow::closeEvent(QCloseEvent *event)
{
int choose;
choose= QMessageBox::question(this, tr("退出程序"),
QString(tr("确认退出程序?")),
QMessageBox::Yes | QMessageBox::No);
if (choose== QMessageBox::No)
{
event->ignore(); //忽略//程序继续运行
}
else if (choose== QMessageBox::Yes)
{
// 保存数据等
event->accept(); //介绍//程序退出
}
}
代码
titlebar.h
#ifndef TITLEBAR_H
#define TITLEBAR_H
#include <QWidget>
#include <QPushButton>
#include <QPixmap>
#include <QLabel>
#include <QPainter>
#include <QMouseEvent>
class BtShutDown : public QPushButton
{
Q_OBJECT
public:
BtShutDown(QWidget *);
private:
protected:
virtual void enterEvent(QEvent *);
virtual void leaveEvent(QEvent *);
void mousePressEvent(QMouseEvent * event);
signals:
};
class BtMin : public QPushButton
{
Q_OBJECT
public:
BtMin(QWidget *);
private:
protected:
virtual void enterEvent(QEvent *);
virtual void leaveEvent(QEvent *);
void mousePressEvent(QMouseEvent * event);
signals:
};
class TitleBar : public QWidget
{
Q_OBJECT
public:
TitleBar(QWidget *parent = 0);
~TitleBar();
static const int barheight=38;
BtMin* minBt;
BtShutDown* shutBt;
QString iconPath;
QFont* textFont;
QLabel* textLabel;
void setTitleBar(QString, QString, int);
private:
QPoint m_start;//起始点
QPoint m_end;//结束点
bool m_leftButtonPressed;//鼠标左键按下标记
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *event);
};
#endif // TITLEBAR_H
titlebar.cpp
#include "titlebar.h"
TitleBar::TitleBar(QWidget *parent):
QWidget(parent)
{
shutBt = new BtShutDown(this);
shutBt->setFocusPolicy(Qt::NoFocus);
//固定窗口大小,最小化失效
// minBt = new BtMin(this);
// minBt->setFocusPolicy(Qt::NoFocus);
//标题文字
textLabel = new QLabel(this);
//设置字体
textFont = new QFont;
textFont->setFamily("黑体");
textFont->setPointSize(20);
textFont->setWeight(QFont::DemiBold);
textLabel->setFont(*textFont);
//颜色
textLabel->setStyleSheet("color:#FFFFFF;");
}
void TitleBar::setTitleBar(QString path,QString title,int width)
{
//设置大小
resize(QSize(width,barheight));
shutBt->setGeometry(width-barheight,0,barheight,barheight);
//minBt->setGeometry(width()-76,0,38,38);
//标题栏图片
iconPath = path;
//标题
textLabel->setGeometry(36,0,width-36-38,34);
textLabel->setText(title);
update();
}
void TitleBar::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(QBrush(QColor(12,160,222)));
painter.setPen(Qt::transparent);
//绘制背景
painter.drawRect(0,0,width(),barheight);
//绘制icon
QPixmap iconPix(iconPath);
painter.drawPixmap(4,4,30,30,iconPix);
}
void TitleBar::mousePressEvent(QMouseEvent *event)
{
// 鼠标左键按下事件
if (event->button() == Qt::LeftButton)
{
// 记录鼠标左键状态
m_leftButtonPressed = true;
//记录鼠标在屏幕中的位置
m_start = event->globalPos();
}
}
void TitleBar::mouseMoveEvent(QMouseEvent *event)
{
// 持续按住才做对应事件
if(m_leftButtonPressed)
{
//将父窗体移动到父窗体原来的位置加上鼠标移动的位置:event->globalPos()-m_start
parentWidget()->move(parentWidget()->pos() +
event->globalPos() - m_start);
//将鼠标在屏幕中的位置替换为新的位置
m_start = event->globalPos();
}
}
void TitleBar::mouseReleaseEvent(QMouseEvent *event)
{
// 鼠标左键释放
if (event->button() == Qt::LeftButton)
{
// 记录鼠标状态
m_leftButtonPressed = false;
}
}
TitleBar::~TitleBar()
{
}
/**********************************
* BtShutDown
*
* *********************************/
BtShutDown::BtShutDown(QWidget *parent):
QPushButton(parent)
{
QSize btSize(38,38);
QPixmap pixmap(":/images/close.jpg");
pixmap=pixmap.scaled(btSize,Qt::KeepAspectRatio);//按比例缩放
resize(pixmap.size());
setStyleSheet("QPushButton{border-image: url(:/images/close.jpg);}");
}
void BtShutDown::mousePressEvent(QMouseEvent *event)
{
if(event->button()== Qt::LeftButton)
{
setStyleSheet("QPushButton{border-image: url(:/images/close_in.jpg);}");
parentWidget()->parentWidget()->close();//关闭
}
}
void BtShutDown::enterEvent(QEvent *)
{
setStyleSheet("QPushButton{border-image: url(:/images/close_in.jpg);}");
}
void BtShutDown::leaveEvent(QEvent *)
{
setStyleSheet("QPushButton{border-image: url(:/images/close.jpg);}");
}
/**********************************
* BtMin
*
* *********************************/
BtMin::BtMin(QWidget *parent):
QPushButton(parent)
{
QSize btSize(38,38);
QPixmap pixmap(":/images/min.jpg");
pixmap=pixmap.scaled(btSize,Qt::KeepAspectRatio);//按比例缩放
resize(pixmap.size());
setStyleSheet("QPushButton{border-image: url(:/images/min.jpg);}");
}
void BtMin::mousePressEvent(QMouseEvent *event)
{
if(event->button()== Qt::LeftButton)
{
setStyleSheet("QPushButton{border-image: url(:/images/min_in.jpg);}");
parentWidget()->parentWidget()->showMinimized();
}
}
void BtMin::enterEvent(QEvent *)
{
setStyleSheet("QPushButton{border-image: url(:/images/min_in.jpg);}");
}
void BtMin::leaveEvent(QEvent *)
{
setStyleSheet("QPushButton{border-image: url(:/images/min.jpg);}");
}