Qt-无标题窗口

时间:2024-11-18 11:52:39

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

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

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

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

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

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

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

  1. QWidget * m_pTitleWidget; //标题栏窗口widget
  2. QPushButton * m_pButtonMin; //最小化按钮
  3. QPushButton * m_pButtonMax; //最大化按钮
  4. QPushButton * m_pButtonRestore; //恢复原始大小按钮
  5. QPushButton * m_pButtonClose; //关闭按钮
  6. QLabel * m_pTitleLabel; //标题栏标签
  7. QHBoxLayout * m_pHTopLayout; //标题栏窗口的布局
  8. QVBoxLayout * m_pVLayout; //标题栏和内容窗口的布局 竖直布局
  1. m_pTitleWidget = new QWidget(); //标题栏窗口
  2. m_pButtonMin = new QPushButton();m_pButtonMin->setObjectName("ButtonMin");
  3. m_pButtonRestore = new QPushButton();m_pButtonRestore->setObjectName("ButtonRestore");
  4. m_pButtonMax = new QPushButton();m_pButtonMax->setObjectName("ButtonMax");
  5. m_pButtonClose = new QPushButton();m_pButtonClose->setObjectName("ButtonClose");
  6. m_pTitleLabel = new QLabel("Title");
  7. m_pHTopLayout = new QHBoxLayout();
  8. m_pVLayout = new QVBoxLayout(); //标题栏和内容窗口的竖直布局管理器
 
  1. m_pTitleWidget->setFixedHeight(60);
  2. m_pTitleWidget->setStyleSheet("background-color:rgb(153, 204, 255);");
  3. //设置按钮大小
  4. m_pButtonMin->setFixedSize(QSize(41, 40));
  5. m_pButtonRestore->setFixedSize(QSize(41, 40));
  6. m_pButtonMax->setFixedSize(QSize(41, 40));
  7. m_pButtonClose->setFixedSize(QSize(41, 40));
  8. //标题栏布局管理器
  9. m_pHTopLayout->addWidget(m_pTitleLabel);
  10. m_pHTopLayout->addSpacing(0);
  11. m_pHTopLayout->addWidget(m_pButtonMin);
  12. m_pHTopLayout->addWidget(m_pButtonRestore);
  13. m_pHTopLayout->addWidget(m_pButtonMax);
  14. m_pHTopLayout->addWidget(m_pButtonClose);
  15. //标题栏设置布局
  16. m_pTitleWidget->setLayout(m_pHTopLayout);
  17. //添加标题栏窗口和内容窗口进竖直布局管理器
  18. m_pVLayout->addWidget(m_pTitleWidget);
  19. //设置与窗体边距为0 使其看着是一个窗口而不是内嵌子窗口
  20. m_pVLayout->setSpacing(0);
  21. m_pVLayout->setMargin(0);
  22. //设置布局
  23. this->setLayout(m_pVLayout);

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

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

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

  1. QWidget * m_pBottomWidget; //内容窗口widget
  2. QPoint m_restorePos; //存储窗口变大前的位置
  3. QSize m_restoreSize; //存储窗口变大前的大小
  1. m_pBottomWidget = new QWidget(); //标题栏下面内容窗口
  2. m_pVLayout->addWidget(m_pBottomWidget);
  3. m_pButtonRestore->setVisible(false);
  1. //最小化按钮按下
  2. void framelessWidget::OnButtonMinClicked()
  3. {
  4. showMinimized();
  5. }
  6. //最大化按钮按下
  7. void framelessWidget::onButtonMaxClicked()
  8. {
  9. m_pButtonRestore->setVisible(true);
  10. m_pButtonMax->setVisible(false);
  11. this->SaveRestoreInfo(this->pos(), QSize(this->width(), this->height()));
  12. QRect desktopRect = QApplication::desktop()->availableGeometry(); //获取可用桌面大小 不适用与多个屏幕
  13. setGeometry(desktopRect);
  14. }
  15. //恢复按钮按下
  16. void framelessWidget::onButtonRestoreClicked()
  17. {
  18. m_pButtonRestore->setVisible(false);
  19. m_pButtonMax->setVisible(true);
  20. this->setGeometry(QRect(m_restorePos, m_restoreSize));
  21. }
  22. //关闭按钮按下
  23. void framelessWidget::onButtonCloseClicked()
  24. {
  25. this->close();
  26. }
  27. //保存变大前的窗口信息
  28. void framelessWidget::SaveRestoreInfo(const QPoint point, const QSize size)
  29. {
  30. m_restorePos = point;
  31. m_restoreSize = size;
  32. }
  1. //信号绑定
  2. connect(m_pButtonMin,&QPushButton::clicked,this,&framelessWidget::OnButtonMinClicked);
  3. connect(m_pButtonMax,&QPushButton::clicked,this,&framelessWidget::onButtonMaxClicked);
  4. connect(m_pButtonRestore,&QPushButton::clicked,this,&framelessWidget::onButtonRestoreClicked);
  5. connect(m_pButtonClose,&QPushButton::clicked,this,&framelessWidget::onButtonCloseClicked);

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

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


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

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

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

****下载地址

github下载地址