Qt 扁平化MainWindow以及自定义标题栏

来源:互联网 发布:科来网络 编辑:程序博客网 时间:2024/06/05 23:57

为了构建出自己认为优雅的界面,需要将Qt自带标题栏啥的去掉。
首先使用Qt Designer创建一个MainWindow的类。

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void on_actionMinimize_triggered();     //最小化窗口    void on_actionClose_triggered();        //关闭窗口    void on_actionMaximize_triggered();     //最大化窗口protected:    //改写QWidget的函数,自己重新实现拖动操作    void mouseMoveEvent ( QMouseEvent * event );    void mousePressEvent ( QMouseEvent * event );    void mouseReleaseEvent(QMouseEvent * event);private:    Ui::MainWindow *ui;    //自己重新实现拖动操作    QPoint mousePosition;    bool isMousePressed;};#endif // MAINWINDOW_H

mainwindow.cpp

#include<QMouseEvent>#include <QToolButton>#include "mainwindow.h"#include "ui_mainwindow.h"using namespace std;//标题栏的长度const static int pos_min_x = 0;const static int pos_max_x = 800 - 120;  //为最小化和关闭按钮留空间const static int pos_min_y = 0;const static int pos_max_y = 20;MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    this->setWindowFlags(Qt::FramelessWindowHint);//去掉窗口标题栏    int width = this->width();//获取界面的宽度    QToolButton *minButton = new QToolButton(this);   //最小按钮    QToolButton *helpButton = new QToolButton(this);  //帮助按钮    QToolButton *closeButton= new QToolButton(this);  //关闭按钮    QToolButton *maxButton = new QToolButton(this);   //最大按钮    QToolButton *menuButton = new QToolButton(this);  //菜单按钮    QToolButton *normalButton = new QToolButton(this);    QToolButton *shadeButton = new QToolButton(this);    QToolButton *unshadeButton = new QToolButton(this);    connect(minButton, SIGNAL(clicked()), this, SLOT(on_actionMinimize_triggered()));    connect(closeButton, SIGNAL(clicked()), this, SLOT(on_actionClose_triggered()));    connect(maxButton, SIGNAL(clicked()), this, SLOT(on_actionMaximize_triggered()));    //获取最小化、关闭按钮图标    QPixmap minPix  = style()->standardPixmap(QStyle::SP_TitleBarMinButton);    QPixmap helpPix = style()->standardPixmap(QStyle::SP_TitleBarContextHelpButton);    QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);    QPixmap maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton);    QPixmap shadePix = style()->standardPixmap(QStyle::SP_TitleBarShadeButton);    QPixmap unshadePix = style()->standardPixmap(QStyle::SP_TitleBarUnshadeButton);    QPixmap normalPix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);    QPixmap menuPix = style()->standardPixmap(QStyle::SP_TitleBarMenuButton);    //设置最小化、关闭按钮图标    minButton->setIcon(minPix);    closeButton->setIcon(closePix);    helpButton->setIcon(helpPix);    maxButton->setIcon(maxPix);    shadeButton->setIcon(shadePix);    unshadeButton->setIcon(unshadePix);    normalButton->setIcon(normalPix);    menuButton->setIcon(menuPix);    //设置最小化、关闭按钮在界面的位置    normalButton->setGeometry(width-160, 0, 20, 20);    menuButton->setGeometry(width-140, 0, 20, 20);    minButton->setGeometry(width-120,0,20,20);    closeButton->setGeometry(width-100,0,20,20);    helpButton->setGeometry(width-80,0,20,20);    maxButton->setGeometry(width-60, 0, 20, 20);    shadeButton->setGeometry(width-40,0, 20, 20);    unshadeButton->setGeometry(width-20, 0, 20, 20);    //设置鼠标移至按钮上的提示信息    minButton->setToolTip(tr("最小化"));    closeButton->setToolTip(tr("关闭"));    maxButton->setToolTip(tr("最大化"));    //设置最小化、关闭等按钮的样式    minButton->setStyleSheet("background-color:transparent;");    closeButton->setStyleSheet("background-color:transparent;");    normalButton->setStyleSheet("background-color:transparent;");    menuButton->setStyleSheet("background-color:transparent;");    helpButton->setStyleSheet("background-color:transparent;");    maxButton->setStyleSheet("background-color:transparent;");    shadeButton->setStyleSheet("background-color:transparent;");    unshadeButton->setStyleSheet("background-color:transparent;");}MainWindow::~MainWindow(){    delete ui;}//自己实现的窗口拖动操作void MainWindow::mousePressEvent(QMouseEvent *event){        //当鼠标单击窗体准备拖动时,初始化鼠标在窗体中的相对位置        mousePosition = event->pos();        //只对标题栏范围内的鼠标事件进行处理        if (mousePosition.x()<=pos_min_x)            return;        if ( mousePosition.x()>=pos_max_x)            return;        if (mousePosition.y()<=pos_min_y )            return;        if (mousePosition.y()>=pos_max_y)            return;        isMousePressed = true;}void MainWindow::mouseMoveEvent(QMouseEvent *event){    if ( isMousePressed==true )    {        QPoint movePot = event->globalPos() - mousePosition;        //move是移动的位置是相对于全局而言(即屏幕)        move(movePot);    }}void MainWindow::mouseReleaseEvent(QMouseEvent *event){    isMousePressed=false;}void MainWindow::on_actionMinimize_triggered(){    //系统自定义的最小化窗口函数    showMinimized();}void MainWindow::on_actionClose_triggered(){    //系统自定义的窗口关闭函数    close();}void MainWindow::on_actionMaximize_triggered(){    //最大化 showMaximized()    showMaximized();}

效果展示

效果图

Note: 本文这里并没有实现随窗体大小动态改变而使标题栏上按钮的相对位置发生改变,感谢大家的帮助。

Reference:
http://blog.sina.com.cn/s/blog_a6fb6cc90101auay.html
http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7岁儿童流清鼻涕怎么办 1岁的宝宝流鼻涕怎么办 3岁宝宝鼻塞严重怎么办 宝宝流鼻涕2个月怎么办 一个月宝宝流鼻子怎么办 六个月宝宝流清水鼻涕怎么办 婴儿流鼻涕怎么办最简单方法 婴儿咳嗽流鼻涕怎么办最简单方法 6个月小孩流鼻涕怎么办 宝宝风寒感冒咳嗽流鼻涕怎么办 三个月宝宝流清鼻涕怎么办 三个月宝宝留清鼻涕怎么办 三个月婴儿流清鼻涕怎么办 宝宝7个月流鼻涕怎么办 6个月孩子流鼻涕怎么办 十一个月孩子感冒流鼻涕怎么办 7个月孩子流鼻涕怎么办 18个月的宝宝流鼻涕怎么办 6个月宝宝咳嗽流鼻涕怎么办 18个月宝宝咳嗽流鼻涕怎么办 6个月宝宝流鼻涕打喷嚏怎么办 宝宝18个月流鼻涕怎么办 18个月宝宝感冒流鼻涕怎么办 小孩睡觉鼻子不通气怎么办 宝宝鼻子里有鼻涕出不来怎么办 孩子喉咙有痰呼呼响怎么办 六个月宝宝鼻塞怎么办速效办法 两个月小孩鼻子不通气怎么办 一岁宝宝流清鼻涕怎么办 孩子鼻子里有鼻涕怎么办 宝宝晚上睡觉鼻子不通气怎么办 宝宝感冒睡觉鼻子不通气怎么办 宝宝3个月流鼻涕怎么办 小孩吃着了发烧怎么办 半岁宝宝鼻子塞怎么办 宝宝伤风鼻子不通气怎么办 二十天的宝宝伤风鼻子不通怎么办 一个多月的宝宝鼻子有鼻屎怎么办 2个月宝宝鼻子里有鼻屎怎么办 四个月婴儿感冒发烧怎么办 一个月婴儿感冒发烧怎么办