Qt5.12 去掉标题栏自定义标题栏以及窗口透明处理

本文是搜集别人的经验,发现有代沟,不行,所以加以汇总想办法解决的。

//main.cpp
	//设置透明度为完全不透明,范围是0-1; 0为全透明,1为不透明
	w.setWindowOpacity(1);
	//第一个是去掉原边框及标题栏,第二个是保留最小化及还原功能,主要是为了还原,最小化下面实现了
	w.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
	//这句话的意思是将不透明的设为半透明的
	w.setAttribute(Qt::WA_TranslucentBackground);

上面三句常用于将窗口设置为半透明,但我的Qt5.12版本是有问题一团黑的,如果你们的也无效那就注意我最后一个函数写的绘画。

//MainWindow.h
#include <QPoint>
#include <QMouseEvent>
#include <QPainter>

	void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

    QPoint mouseQPoint;
}

//MainWindow.cpp
//自定义最小化和关闭
//构造函数中
    QToolButton *closeButton = new QToolButton(this);
    QToolButton *minButton = new QToolButton(this);

    //QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
    QPixmap *closePix = new QPixmap(":/new/prefix1/icon/close.png");
    QPixmap *minPix = new QPixmap(":/new/prefix1/icon/min.png");

    closeButton->setIcon(*closePix);
    minButton->setIcon(*minPix);

    closeButton->setGeometry(frameGeometry().width()-35,5,30,30);
    minButton->setGeometry(frameGeometry().width()-65,5,30,30);

    closeButton->setToolTip(tr("close"));
    minButton->setToolTip(tr("minimum"));

    closeButton->setStyleSheet("background-color:transparent;");
    minButton->setStyleSheet("background-color:transparent;");
    
    connect(closeButton,SIGNAL(clicked()),this,SLOT(windowclosed()));
    connect(minButton,SIGNAL(clicked()),this,SLOT(windowmin()));
}

//为自定义的关闭及最小化提供实际功能
void MainWindow::windowclosed()
{
    this->close();
}

void MainWindow::windowmin()
{
    this->showMinimized();
}

//自定义鼠标移动
void MainWindow::mousePressEvent(QMouseEvent * event)
{
	if(event->button() == Qt::RightButton)		//右键其不触发mouseReleaseEvent,否则有使用体验bug
		return;
	
    QPoint &&mousePoint = event->globalPos();
    QPoint &&topPoint = this->geometry().topLeft();
    mouseQPoint = mousePoint - topPoint;

}

//mouseQPoint是QPoint类型,直接在类成员变量,无需初始化。
void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
    QPoint &&mousePoint = event->globalPos();
    QPoint point = mousePoint - mouseQPoint;
    if(!mouseQPoint.isNull())
        this->move(point);
}

void MainWindow::mouseReleaseEvent(QMouseEvent * event)
{
    this->mouseQPoint = QPoint();
}

//界面绘画
//我这个是实现圆角及透明程度的绘画
void MainWindow::paintEvent( QPaintEvent* event)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QBrush(QColor(68,68,68,225)));//这里QColor的第四个参数是透明度参数设置
    painter.setPen(Qt::transparent);

    QRect rect = this->rect();
    rect.setWidth(rect.width()-5);
    rect.setHeight(rect.height()-5);
    painter.drawRoundedRect(rect,15,15);
    //painter.fillRect(rect,QColor(68,68,68,225));//如果不需要圆角那就只需要这句和painter的定义

    QMainWindow::paintEvent(event);
}

至于标题和图标那些,直接在左上角自己设俩个QLabel就行了,一个图标一个标题
如果想Window的底下任务栏显示你想要的图标,就用下面这句,在构造函数里。

setWindowIcon(QIcon("你资源的路径地址"));
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值