布局
实现自定义标题栏,首先取消系统标题栏
窗体放入两个widget,一个作为标题栏,另一个作为窗体显示内容

对于标题widget1,右键设置样式表,添加一个背景色

向widget1添加一个label,两个按钮,右键布局,设置为水平布局

对于两个按钮,属性中设置它们的最大宽度40

widget2添加一个测试标签

对于窗体右键,布局,垂直布局


标题栏太高,设置属性最大高度40


运行程序

对于窗体中的centralwidget,设置它的属性边距宽度,LeftMargin、TopMargin、RightMargin、BottomMargin都为0,widget与窗体无空白

widget1的左右边距宽度都为9,控件与widget左右边缘空白


导入图标
在项目文件夹下建立resource目录,导入最小化和关闭等图标,文件,新建,Qt Resource File导入它们
执行qmake
对于标题栏按钮,属性中设置空文本

选择导入的图标

标题栏按钮,设置样式表,背景透明

效果

鼠标拖动
窗体类头文件
//鼠标拖动窗体移动
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
bool m_bDrag;
QPoint mouseStartPoint;
QPoint windowTopLeftPoint;
源文件
//实现鼠标拖拽移动
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_bDrag = true;
//获得鼠标的初始位置
mouseStartPoint = event->globalPos();
//mouseStartPoint = event->pos();
//获得窗口的初始位置
windowTopLeftPoint = this->frameGeometry().topLeft();
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(m_bDrag)
{ //这里if语句判断,让鼠标在特定控件上进行拖动才有效,比如自绘标题栏控件
if(!ui->label->underMouse()){
return;
}
//获得鼠标移动的距离
QPoint distance = event->globalPos() - mouseStartPoint;
//QPoint distance = event->pos() - mouseStartPoint;
//改变窗口的位置
this->move(windowTopLeftPoint + distance);
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_bDrag = false;
}
}
按钮功能
通过信号槽绑定最小化和关闭按钮的功能函数
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(showMinimized()));
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
效果
