分享

Qt重画标题栏

 芥子c1yw3tb42g 2023-10-13 发布于陕西
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过滤即可

}

效果如图下所示:


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多