Qt总结(十二)-- 半透明通知窗口hintBox &&自制标题栏

半透明通知窗口

(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);}");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值