FramelessWindow实现qt无边框窗口

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

FramelessWindow.h文件链接
添加FramelessWindow.h头文件

在你的qt项目中将FramelessWindow.h头文件导入进来,或者使用cmake、qmake将包含该头文件的目录引入。
简单浏览framelessWindow代码

我们发现FramelessWindow是一个继承模板参数的类模板。

并且看一下构造函数

简单实现

1.继承该类模板,如果你想创建一个QFrame窗口那么就用QFrame当 模板参数,如果创建QMainWindow窗口就使用QMainWindow,QDialog就QDialog。
这里我使用QFrame

2.编写构造函数,这里背景色我使用不是透明,enable=true,并且使用setResizeable开启了可改变大小的功能,后面的4个数字窗口的四个边界padding,当鼠标在这个padding中,那么就鼠标就变成缩放的指针图标并且开启缩放功能。

3.一般来说我们想要窗口可以随意拖拽,但是去掉系统的标题栏后拖拽功能也需要我们自己实现,FramelessWindow已经帮我们实现了该功能。使用setTitleBar函数将我们想要可以拖拽的控件添加进去,即可实现鼠标拖拽。
  1. QFrame* MainWidget::createHeader()
  2. {
  3.         QFrame* header = new QFrame();
  4.         header->setFixedHeight(36);
  5.         QHBoxLayout* header_lyt = new QHBoxLayout();
  6.         header_lyt->setContentsMargins({ 2, 2, 2, 2 });
  7.         header->setLayout(header_lyt);
  8.         QFrame* menu_bar_frame = new QFrame();
  9.         QHBoxLayout* menu_bar_lyt = new QHBoxLayout();
  10.         menu_bar_lyt->setContentsMargins({ 0, 0, 0, 0 });
  11.         QLabel* logo = new QLabel();
  12.         logo->setFixedSize({ 24, 24 });
  13.         QPixmap* pixmap = new QPixmap("./resources/icons/algorithm_icon.png");
  14.         pixmap->scaled(logo->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
  15.         logo->setPixmap(*pixmap);
  16.         QPushButton* button = new QPushButton(u8"文件(F)");
  17.         QMenu* menu = new QMenu();
  18.         menu->addAction("Option 1");
  19.         menu->addAction("Option 2");
  20.         menu->addAction("Option 3");
  21.         button->setMenu(menu);
  22.         button->setStyleSheet("QPushButton::menu-indicator{image:none}");
  23.         QFrame* menu_frame = new QFrame();
  24.         QHBoxLayout* menu_frame_lyt = new QHBoxLayout();
  25.         menu_frame_lyt->setContentsMargins(0, 0, 0, 0);
  26.         menu_frame->setLayout(menu_frame_lyt);
  27.         menu_frame_lyt->addWidget(button);
  28.         menu_bar_lyt->addWidget(logo);
  29.         menu_bar_lyt->addWidget(menu_frame);
  30.         menu_bar_frame->setLayout(menu_bar_lyt);
  31.         QFrame* op_bar = new QFrame();
  32.         op_bar->setFixedWidth(100);
  33.         QHBoxLayout* op_bar_lyt = new QHBoxLayout();
  34.         op_bar_lyt->setContentsMargins({ 0, 0, 0, 0 });
  35.         QToolButton* min_btn = new QToolButton();
  36.         resize_btn = new QToolButton();
  37.         QToolButton* close_btn = new QToolButton();
  38.         QIcon min_icon("./resources/icons/min_icon.png");
  39.         normal_icon = QIcon("./resources/icons/window_icon.png");
  40.         max_icon = QIcon("./resources/icons/max_icon.png");
  41.         QIcon close_icon("./resources/icons/close_icon.png");
  42.         min_btn->setIcon(min_icon);
  43.         resize_btn->setIcon(max_icon);
  44.         close_btn->setIcon(close_icon);
  45.         op_bar_lyt->addWidget(min_btn);
  46.         op_bar_lyt->addWidget(resize_btn);
  47.         op_bar_lyt->addWidget(close_btn);
  48.         op_bar->setLayout(op_bar_lyt);
  49.         header_lyt->addWidget(menu_bar_frame);
  50.         header_lyt->addStretch(1);
  51.         header_lyt->addWidget(op_bar);
  52.         setTitlebar({ header, menu_frame, op_bar, menu_bar_frame, logo });
  53.         connect(min_btn, &QPushButton::clicked, this, &MainWidget::onMinBtn);
  54.         connect(resize_btn, &QPushButton::clicked, this, &MainWidget::onResizeBtn);
  55.         connect(close_btn, &QPushButton::clicked, this, &MainWidget::onCloseBtn);
  56.         return header;
  57. }
复制代码
4.去掉系统的标题栏后,窗口的最小化 最大化和关闭功能也需要我们自己实现。上述代码中的 min_btn  resize_btn和close_btn分别实现了最小化按钮,最大化按钮和关闭按钮。他们的槽函数如下。
  1. void MainWidget::onResizeBtn()
  2. {
  3.         if (this->isMaximized())
  4.         {
  5.                 this->showNormal();
  6.         }
  7.         else
  8.         {
  9.                 this->showMaximized();
  10.         }
  11. }
  12. void MainWidget::onCloseBtn()
  13. {
  14.         close();
  15. }
  16. void MainWidget::resizeEvent(QResizeEvent* event)
  17. {
  18.         if (this->isMaximized())
  19.         {
  20.                 resize_btn->setIcon(normal_icon);
  21.         }
  22.         else
  23.         {
  24.                 resize_btn->setIcon(max_icon);
  25.         }
  26. }
复制代码
希望可以帮到大家。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表