今天学习了下无标题窗口,于是来记录下我的学习过程
首先建立一个Qt Widgets Application继承QWidget类创建完后直接运行就得到了如下效果
那么,既然是无标题窗口就要去掉窗口栏啊,于是加上
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);
这样运行后就得到了如下窗口:
但是还有问题,就是按钮没有任何功能,并且只有标题栏没有内容窗口导致标题栏跑到中间了
那么我们现在再添加一个内容窗口,并且添加上按钮的功能实现
-
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);
这样我们就得到了一个比较像窗口的窗口
然后我们在添加些图片再加上css就得到了如下:
关于重写鼠标事件在源码里都有
最后得到的就是一个很简单的无标题窗口,那些界面美化什么的以后根据具体场景具体实现吧,总之是一个还可以的基类窗口
如有需要下载学习的可以到如下地址下载
****下载地址
github下载地址