概述
今天学习了下无标题窗口,于是来记录下我的学习过程
首先建立一个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就得到了如下:
关于重写鼠标事件在源码里都有
最后得到的就是一个很简单的无标题窗口,那些界面美化什么的以后根据具体场景具体实现吧,总之是一个还可以的基类窗口
如有需要下载学习的可以到如下地址下载
CSDN下载地址
github下载地址
最后
以上就是靓丽仙人掌为你收集整理的Qt-无标题窗口的全部内容,希望文章能够帮你解决Qt-无标题窗口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复