Qt-无标题窗口

        今天学习了下无标题窗口,于是来记录下我的学习过程

首先建立一个Qt Widgets Application继承QWidget类创建完后直接运行就得到了如下效果

Qt-无标题窗口_第1张图片

那么,既然是无标题窗口就要去掉窗口栏啊,于是加上

setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);

去掉标题栏,但是这样整个窗口就不能移动了,也不能最小最大关闭了;

那么现在我们赶紧写一个标题栏,放几个按钮在上面,让这个窗口能关闭吧

于是我们添加上该有的头文件然后:

    QWidget * m_pTitleWidget;                        //标题栏窗口widget
    QPushButton * m_pButtonMin;                     //最小化按钮
    QPushButton * m_pButtonMax;                     //最大化按钮
    QPushButton * m_pButtonRestore;                 //恢复原始大小按钮
    QPushButton * m_pButtonClose;                   //关闭按钮
    QLabel * m_pTitleLabel;                          //标题栏标签
    QHBoxLayout * m_pHTopLayout;                    //标题栏窗口的布局
    QVBoxLayout * m_pVLayout;                       //标题栏和内容窗口的布局 竖直布局
    m_pTitleWidget = new QWidget();                                                 //标题栏窗口
    m_pButtonMin = new QPushButton();m_pButtonMin->setObjectName("ButtonMin");
    m_pButtonRestore = new QPushButton();m_pButtonRestore->setObjectName("ButtonRestore");
    m_pButtonMax = new QPushButton();m_pButtonMax->setObjectName("ButtonMax");
    m_pButtonClose = new QPushButton();m_pButtonClose->setObjectName("ButtonClose");
    m_pTitleLabel = new QLabel("Title");

    m_pHTopLayout = new QHBoxLayout();
    m_pVLayout = new QVBoxLayout();                                                 //标题栏和内容窗口的竖直布局管理器
 
  
    m_pTitleWidget->setFixedHeight(60);
    m_pTitleWidget->setStyleSheet("background-color:rgb(153, 204, 255);");

    //设置按钮大小
    m_pButtonMin->setFixedSize(QSize(41, 40));
    m_pButtonRestore->setFixedSize(QSize(41, 40));
    m_pButtonMax->setFixedSize(QSize(41, 40));
    m_pButtonClose->setFixedSize(QSize(41, 40));

    //标题栏布局管理器
    m_pHTopLayout->addWidget(m_pTitleLabel);
    m_pHTopLayout->addSpacing(0);
    m_pHTopLayout->addWidget(m_pButtonMin);
    m_pHTopLayout->addWidget(m_pButtonRestore);
    m_pHTopLayout->addWidget(m_pButtonMax);
    m_pHTopLayout->addWidget(m_pButtonClose);

    //标题栏设置布局
    m_pTitleWidget->setLayout(m_pHTopLayout);

    //添加标题栏窗口和内容窗口进竖直布局管理器
    m_pVLayout->addWidget(m_pTitleWidget);

    //设置与窗体边距为0 使其看着是一个窗口而不是内嵌子窗口
    m_pVLayout->setSpacing(0);
    m_pVLayout->setMargin(0);

    //设置布局
    this->setLayout(m_pVLayout);

这样运行后就得到了如下窗口:

Qt-无标题窗口_第2张图片

但是还有问题,就是按钮没有任何功能,并且只有标题栏没有内容窗口导致标题栏跑到中间了

那么我们现在再添加一个内容窗口,并且添加上按钮的功能实现

QWidget * m_pBottomWidget;                       //内容窗口widget 
QPoint m_restorePos;                            //存储窗口变大前的位置
QSize m_restoreSize;                            //存储窗口变大前的大小
m_pBottomWidget = new QWidget();                                                //标题栏下面内容窗口
m_pVLayout->addWidget(m_pBottomWidget); 
m_pButtonRestore->setVisible(false);
//最小化按钮按下
void framelessWidget::OnButtonMinClicked()
{
    showMinimized();
}

//最大化按钮按下
void framelessWidget::onButtonMaxClicked()
{
    m_pButtonRestore->setVisible(true);
    m_pButtonMax->setVisible(false);

    this->SaveRestoreInfo(this->pos(), QSize(this->width(), this->height()));
    QRect desktopRect = QApplication::desktop()->availableGeometry();       //获取可用桌面大小 不适用与多个屏幕
    setGeometry(desktopRect);
}

//恢复按钮按下
void framelessWidget::onButtonRestoreClicked()
{
    m_pButtonRestore->setVisible(false);
    m_pButtonMax->setVisible(true);

    this->setGeometry(QRect(m_restorePos, m_restoreSize));
}

//关闭按钮按下
void framelessWidget::onButtonCloseClicked()
{
    this->close();
}

//保存变大前的窗口信息
void framelessWidget::SaveRestoreInfo(const QPoint point, const QSize size)
{
    m_restorePos = point;
    m_restoreSize = size;
}

    //信号绑定
    connect(m_pButtonMin,&QPushButton::clicked,this,&framelessWidget::OnButtonMinClicked);
    connect(m_pButtonMax,&QPushButton::clicked,this,&framelessWidget::onButtonMaxClicked);
    connect(m_pButtonRestore,&QPushButton::clicked,this,&framelessWidget::onButtonRestoreClicked);
    connect(m_pButtonClose,&QPushButton::clicked,this,&framelessWidget::onButtonCloseClicked);

这样我们就得到了一个比较像窗口的窗口

Qt-无标题窗口_第3张图片

然后我们在添加些图片再加上css就得到了如下:

Qt-无标题窗口_第4张图片

关于重写鼠标事件在源码里都有

最后得到的就是一个很简单的无标题窗口,那些界面美化什么的以后根据具体场景具体实现吧,总之是一个还可以的基类窗口

如有需要下载学习的可以到如下地址下载

CSDN下载地址

github下载地址



你可能感兴趣的:(c/c++,Qt,无标题窗口)