一.前言
Qt采用系统的标题栏,会发现使用Qss的时候,标题栏是没有被渲染到的,这个时候就需要用到自定义标题栏了,楼主一开始也正是为了这一目的,保证样式的统一,故楼主就此做一个记录分享
二.实现过程
1.整体思路
》隐藏系统标题栏
》捕捉鼠标点击事件 移动事件以及释放事件
》坐标的计算
当鼠标在窗体的标题栏按下并移动时,窗体会按照鼠标移动的轨迹进行平移。因此,窗体每次移动都是在当前位置按照鼠标移动的矢量进行移动。
MouseEvent中的globalPos()函数返回的是相对屏幕的位置坐标,而pos()则是返回鼠标在当前控件(即捕获该鼠标事件的控件)中的位置
2.核心代码
void MyTitleBar::mousePressEvent(QMouseEvent *e)
{
int maxWidth = this->width();
int maxHeight = 35; // 鼠标点击的有效高度 可根据实际适当调整
if(e->button()==Qt::LeftButton) // 设置鼠标左键点击才有效
{
if(e->pos().x()<=0 ||e->pos().x()>=maxWidth)
return;
if(e->pos().y()<=0 || e->pos().y()>=maxHeight)
return;
mousePress=true;
pressPoint=e->globalPos()-this->pos();
}
}
void MyTitleBar::mouseMoveEvent(QMouseEvent *e)
{
if(mousePress &&!max) // 窗口最大化不移动
{
QPoint point=e->globalPos()-pressPoint;
this->move(point);
}
}
void MyTitleBar::mouseReleaseEvent(QMouseEvent)
{
mousePress=false;
}
3.增加最大化/最小化/关闭 双击标题栏最大化/恢复功能
void MyTitleBar::on_pushButton_1_clicked()
{
showMinimized();
}
void MyTitleBar::on_pushButton_2_clicked()
{
if(max)
{
showNormal();
max=false;
ui->pushButton_2->setText("最大化");
}
else
{
showMaximized();
max = true;
ui->pushButton_2->setText("恢复");
}
}
void MyTitleBar::on_pushButton_3_clicked()
{
close();
}
void MyTitleBar::mouseDoubleClickEvent(QMouseEvent *e)
{
if(e->button()==Qt::LeftButton) // 设置鼠标左边双击才有用
{
if(max)
{
showNormal();
max=false;
ui->pushButton_2->setText("最大化");
}
else
{
showMaximized();
max = true;
ui->pushButton_2->setText("恢复");
}
}
}
4.预览