先看效果图:
完成的功能:最大化、最小化、关闭窗口、拖拽标题栏、标题栏圆角。
1)新建一个widget,名字为test1
2)mainwindow中建立一个pushbutton,让按下后弹出test1页面。
3)直接上代码
这是.h文件
#ifndef TEST1_H
#define TEST1_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QScreen>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QDebug>
namespace Ui {
class test1;
}
class test1 : public QWidget
{
Q_OBJECT
public:
explicit test1(QWidget *parent = nullptr);
~test1();
protected:
void mouseMoveEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
private slots:
void Slot_btnMenu_Close_clicked();
void Slot_btnMenu_Max_clicked();
void Slot_btnMenu_Min_clicked();
private:
Ui::test1 *ui;
bool m_bmax;
QRect m_location;
bool TitleBar_LmousePressed;
QPoint pressPoint;
QLabel *lab_Title = new QLabel("页面1");
QLabel *labelPic = new QLabel(); //标题栏LOGO
QPushButton *btnMenu_Close = new QPushButton();
QPushButton *btnMenu_Max = new QPushButton();
QPushButton *btnMenu_Min = new QPushButton();
QWidget *Widget_Title = new QWidget;//标题栏
QWidget *Widget_content = new QWidget;//内容栏
};
#endif // TEST1_H
这是cpp文件
#include "test1.h"
#include "ui_test1.h"
test1::test1(QWidget *parent) :
QWidget(parent),
ui(new Ui::test1)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);//隐藏标题栏
m_location = this->geometry();//保存默认尺寸
m_bmax = false;//最大化变量赋初值
TitleBar_LmousePressed = false;//标题栏拖拽变量赋初值
QHBoxLayout *Hlay_menu = new QHBoxLayout;//标题栏
QVBoxLayout *Vlay_main = new QVBoxLayout;//整体
this->setLayout(Vlay_main);
this->setStyleSheet("border-radius:5px;");//标题栏圆角
this->setAttribute(Qt::WA_TranslucentBackground);
Vlay_main->setMargin(0);
Vlay_main->addWidget(Widget_Title);
Widget_Title->setFixedHeight(30);
Widget_Title->setContentsMargins(0,0,0,0);
Widget_Title->setStyleSheet("background-color: rgba(56, 56, 56, 100%)");
Vlay_main->addWidget(Widget_content);
Widget_content->setStyleSheet("background-color: rgb(240, 250, 250)");
Vlay_main->setStretch(0,1);
Vlay_main->setStretch(1,10);
Vlay_main->setSpacing(0);
Widget_Title->setLayout(Hlay_menu);
Hlay_menu->setContentsMargins(0,0,0,0);
Hlay_menu->addWidget(labelPic);
Hlay_menu->addWidget(lab_Title);
Hlay_menu->addWidget(btnMenu_Min);
Hlay_menu->addWidget(btnMenu_Max);
Hlay_menu->addWidget(btnMenu_Close);
labelPic->setFixedSize(20,20);
labelPic->setStyleSheet("border-image: url(:/new/prefix1/temp/page_camera.png);border-radius:0px;");
lab_Title->setStyleSheet("color:white");
btnMenu_Min->setFixedSize(50,15);
btnMenu_Min->setStyleSheet("border-image: url(:/new/prefix1/temp/min.png);border-radius:0px;");
btnMenu_Max->setFixedSize(50,15);
btnMenu_Max->setStyleSheet("border-image: url(:/new/prefix1/temp/max.png);border-radius:0px;");
btnMenu_Close->setFixedSize(50,15);
btnMenu_Close->setStyleSheet("border-image: url(:/new/prefix1/temp/close.png);border-radius:0px;");
Hlay_menu->setStretch(0,1);
Hlay_menu->setStretch(1,10);
Hlay_menu->setStretch(2,1);
Hlay_menu->setStretch(3,1);
Hlay_menu->setStretch(4,1);
connect(btnMenu_Max,&QPushButton::clicked,this,&test1::Slot_btnMenu_Max_clicked);
connect(btnMenu_Min,&QPushButton::clicked,this,&test1::Slot_btnMenu_Min_clicked);
connect(btnMenu_Close,&QPushButton::clicked,this,&test1::Slot_btnMenu_Close_clicked);
}
test1::~test1()
{
delete ui;
}
void test1::Slot_btnMenu_Max_clicked()
{
if(m_bmax)
{
showNormal();
m_bmax=false;
}
else
{
showMaximized();
m_bmax = true;
}
qDebug()<<"max_click"<<m_bmax;
}
void test1::Slot_btnMenu_Min_clicked()
{
showMinimized();
qDebug()<<"min_click"<<m_bmax;
}
void test1::Slot_btnMenu_Close_clicked()
{
this->close();
}
void test1::mouseMoveEvent(QMouseEvent *e)
{
if(TitleBar_LmousePressed &&!m_bmax) // 窗口最大化不移动
{
QPoint point=e->globalPos()-pressPoint;
this->move(point);
}
}
void test1::mousePressEvent(QMouseEvent *e)
{
int maxWidth = this->width();
int maxHeight = 30; // 鼠标点击的有效高度 可根据实际适当调整
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;
TitleBar_LmousePressed=true;
pressPoint=e->globalPos()-this->pos();
}
}
void test1::mouseReleaseEvent(QMouseEvent *)
{
TitleBar_LmousePressed = false;
}
4)还有几个问题没处理。先留存