在使用Qt制作软件时,为了追求界面美观或者软件整体布局的协调性,通常我们会希望修改程序自带的系统标题栏,但是我找了好久,都没有找到直接修改系统标题栏样式的方法,大多数都是通过去除系统自带边框和标题栏,自己设计一个自定义的标题栏。
具体方法如下:
/*************************************** 注意 ********************************************************
1.隐藏标题栏相当于将窗口的边框隐藏了,此时通过样式表设置窗口边框圆角或其他边框属性无效
2.拖拽边框设置窗口大小缩放无效
*******************************************************************************************************/
//1.首先第一步就是,隐藏Windows窗口自带的标题栏
this->setWindowFlag(Qt::FramelessWindowHint);
//通过设置窗口的标志来实现隐藏窗口标题栏的功能
//常用的其他窗口标志如下:
// Qt::Tool //隐藏任务栏图标
// Qt::Tooltip //隐藏窗口标题栏和任务栏图标
// Qt::FramelessWindowHint //隐藏标题栏(无法移动和缩放窗口)
//2.设置隐藏窗口标题栏后就无法移动和缩放窗口了
//想要移动和缩放窗口,就需要重载鼠标事件
// a.在.h文件中声明一个变量用来存放位置坐标
private:
QPoint m_lastPos;
// b.声明鼠标事件函数
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
// c.重写鼠标事件
//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
//移动窗口
this->move(this->x()+(event->globalX()-m_lastPos.x()),this->y()+(event->globalY()-m_lastPos.y()));
//记录窗口坐标
m_lastPos = event->globalPos();
}
//鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//记录鼠标按下时的窗口坐标
m_lastPos = event->globalPos();
}
//鼠标松开事件
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
//记录鼠标松开时窗口的坐标
m_lastPos = event->globalPos();
}
/********************************** 相关函数 *****************************************
this->move(x,y); //移动当前窗口位置至指定xy点;
event->globalPos(); //返回鼠标事件发生时的全局坐标点;
event->globalX(); //返回鼠标事件发生时的全局坐标点的x坐标;
event->globaly(); //返回鼠标事件发生时的全局坐标点的y坐标;
****************************************************************************************/
在设置窗口无标题栏时,是通过去掉窗口边框实现的,在这种情况下,设置窗口边框圆角属性是无法生效的,如果要设置圆角的话,可以参考以下方法。
一、设置窗口背景透明
this->setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
二、在整个界面中添加一个widget控件作为整个软件的背景板
三、由于设置了窗口透明,第二步中所设的widget的边框,就可以近似看作软件的边框,这样设置widget的qss样式表中的圆角属性,就可以实现窗口圆角了。
QWdiget#widget_background{
border:1px solid #000000;
border-radius:5px;
}