1. 在头文件中添加下列三个函数
//鼠标点击标题栏,重新实现拖动操作
void mouseMoveEvent(QMouseEvent*event);
void mousePressEvent(QMouseEvent*event);
void mouseReleaseEvent(QMouseEvent*event);
2. 在头文件中添加下列三个槽函数
private slots:
void actionMin(); //最小化窗口
void actionMax(); //最大化窗口
void actionClose(); //关闭窗口
3.在头文件中下列变量
QPoint mousePosition; //自己实现拖动操作
bool isMousePressed; //自己实现拖动操作
QToolButton *minButton; //最小化按钮
QToolButton *maxButton; //最大化按钮
QToolButton *closeButton; //关闭按钮
QLabel *labelTitle; //软件名称
QLabel *iconLabel; //软件图标
bool maxNormal; //判断是否最大化标志位
QPixmap normalPix; //缩小图标
QPixmap maxPix; //最大化图标
4.定义鼠标可拖动区域
/********************鼠标作用域******************/
using namespace std;
const static int posMinX=0;
const static int posMaxX=20000;
const static int posMinY=0;
const static int posMaxY=40;
5.在构造函数中添加进行初始化
minButton=new QToolButton(this); //最小化按钮
maxButton=new QToolButton(this); //最大化按钮
closeButton=new QToolButton(this); //关闭按钮
iconLabel=new QLabel(this); //图标按钮
labelTitle=new QLabel(this); //软件标题
int width=this->width(); //获取软件占得像素大小
this->setMinimumSize(900,600); //设置最小窗口
this->resize(QSize(900,600)); //初始化窗口显示大小
this->setWindowFlags(Qt::FramelessWindowHint); //去掉标题栏
QDesktopWidget *desktop=QApplication::desktop();
this->move((desktop->width()-this->width())/2,
(desktop->height()-this->height())/2); //程序显示在屏幕中间
/****************加载图标*******************/
Qpixmap closePix
=style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
closeButton->setIcon(closePix);
MaxPix
=style()->standardPixmap(QStyle::SP_TitleBarMaxButton);
maxButton->setIcon(maxPix);
QPixmap minPix =style()->standardPixmap(QStyle::SP_TitleBarMinButton);
minButton->setIcon(minPix);
normalPix =style()->standardPixmap(QStyle::SP_TitleBarNormalButton);
/*****************加载位置******************/
iconLabel->setGeometry(10,7,22,22);
labelTitle->setGeometry(34,4,120,30);
minButton->setGeometry(width-96,6,30,30);
maxButton->setGeometry(width-66,6,30,30);
closeButton->setGeometry(width-36,6,30,30);
/******************提示信息*****************/
minButton->setToolTip(tr("最小化"));
maxButton->setToolTip(tr("最大化"));
closeButton->setToolTip(tr("关闭"));
ui->actionConn->setToolTip(tr("打开串口"));
labelTitle->setText(tr("雷达"));
/*****************添加背景颜色**************/ minButton->setStyleSheet("background-color:transparent;");
maxButton->setStyleSheet("background-color:transparent;"); closeButton->setStyleSheet("background-color:transparent;");
setWindowIcon(QIcon(":/new/prefix1/RES/radar.png"));
maxNormal=false; //是否最大化
isMousePressed=false; //鼠标是否被按下
/******************信号与槽连接**************/
//最小化按钮
connect(minButton,SIGNAL(clicked(bool)),SLOT(actionMin()));
//最大化按钮
connect(maxButton,SIGNAL(clicked(bool)),SLOT(actionMax()));
//关闭按钮 connect(closeButton,SIGNAL(clicked(bool)),SLOT(actionClose()));
QFont font("ZYSong",11); //字体大小为宋体11号字体
labelTitle->setFont(font); //设置字体
setPalette(QPalette(Qt::DownArrow));//设置背景色
setAutoFillBackground(true);
6.在函数中实现
/***************最小化************************/
void RadarWindow::actionMin()
{
showMinimized();
}
/***************最大化************************/
void RadarWindow::actionMax()
{
if(maxNormal)
{
this->showNormal();
maxNormal=!maxNormal;
maxButton->setIcon(maxPix);
}
else
{
this->showMaximized();
maxNormal=!maxNormal;
maxButton->setIcon(normalPix);
}
}
/***************关闭************************/
void RadarWindow::actionClose()
{
close(); //关闭
}
/***************鼠标移动********************/
void RadarWindow::mouseMoveEvent(QMouseEvent *event)
{
if(maxNormal)
{
return;
}
if(isMousePressed==true)
{
QPoint movePot=event->globalPos()-mousePosition;
move(movePot);
}
}
/***************鼠标点击*******************/
void RadarWindow::mousePressEvent(QMouseEvent *event)
{
mousePosition=event->pos(); //当鼠标单击窗体准备拖动时,初始化鼠标在窗体中的相对位置
//只对标题栏范围内的鼠标事件进行处理
if(mousePosition.x()<=posMinX)
{
return;
}
if(mousePosition.x()>=posMaxX)
{
return;
}
if(mousePosition.y()<=posMinY)
{
return;
}
if(mousePosition.y()>=posMaxY)
{
return;
}
isMousePressed=true;
}
/***************鼠标释放*******************/
void RadarWindow::mouseReleaseEvent(QMouseEvent *event)
{
isMousePressed=false;
}
/***************自动保存******************/
void RadarWindow::on_pushButtonSave_clicked()
{
if(!ok)
{
return;
}
if(ui->pushButtonSave->text()==tr("停止保存"))
{
ui->pushButtonSave->setText(tr("保存"));
if(fileOk)
{
fileSave->close();
delete fileSave;
fileOk=false;
}
}
else if (ui->pushButtonSave->text()==tr("保存"))
{
ui->pushButtonSave->setText(tr("停止保存"));
}
}
7.在函数中实现将窗口画成圆角形窗口
/***************画图函数************************/
void MainWindow::paintEvent(QPaintEvent *)
{
QBitmap objBitmap(size()); //生成一张位图
QPainter painterBit(&objBitmap); //在位图上绘画
painterBit.fillRect(rect(),Qt::white);//填充位图矩形框
painterBit.setBrush(QColor(0,0,0)); //位图上画圆角矩形
painterBit.drawRoundedRect(this->rect(),10,10);
setMask(objBitmap); //使用setMark过滤即可
}
效果如图下所示: