前言

  1. Qt原本的窗口虽然可以通过QSS样式进行美化,但是只是对客户区有用,对于客户区是无效的。所以想做出一个比较好看的程序,还得自己重写实现无边框窗口。
  2. Qt实现无边框其实一句代码就可以,但是窗口自带的缩放,移动功和关闭功能都会没有,需要自己重写。

    setWindowFlags(Qt::FramelessWindowHint);

重写无边框窗口

1.效果如下



2.由于无边框窗口没有了标题栏和最小化,最大化,关闭的按钮,所以需要自己布局相对应的控件,并重写事件。我的布局如下



3.事件对应代码

展开
//窗口关闭事件
void MainWindow::windowClose()
{
qApp->exit();
} //窗口最小化
void MainWindow::windowMin()
{
this->showMinimized();
}
//窗口最大化
void MainWindow::windowMax()
{
isMaxWin=!isMaxWin;
if(isMaxWin) //根据是否最大化窗口,改变对应的图标
{
ui->btnMax->setIcon(QIcon(":/icons/normal.png"));
this->showMaximized();
}
else
{
ui->btnMax->setIcon(QIcon(":/icons/maxsize.png"));
this->showNormal();
}
}

4.窗口移动事件,需要重写鼠标的点击事件和移动事件

展开
void MainWindow::mousePressEvent(QMouseEvent*event)
{
if(event->button()==Qt::LeftButton) //如果鼠标左键按下
{
isPressed=true;
curPos=event->pos(); //记录当前的点击坐标
}
} void MainWindow::mouseMoveEvent(QMouseEvent*event)
{
if(isPressed) //如果鼠标左键按下
{
this->move(event->pos()-curPos+this->pos()); //窗口移动
}
} //鼠标释放
void MainWindow::mouseReleaseEvent(QMouseEvent*event)
{
isPressed=false;
}

3.窗口的缩放功能比较麻烦,需要用到windows的消息机制.代码如下

展开
//需要包含头文件
/*
#include <qt_windows.h>
#include <Windowsx.h>
*/
//消息处理
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
int m_nBorder = 5; //边界宽度
Q_UNUSED(eventType)
MSG *param = static_cast<MSG *>(message); switch (param->message)
{
case WM_NCHITTEST:
{
int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();
int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y(); *result = HTCAPTION; //判断鼠标位置是否位于窗口边界
if ((nX > 0) && (nX < m_nBorder))
*result = HTLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width()))
*result = HTRIGHT; if ((nY > 0) && (nY < m_nBorder))
*result = HTTOP; if ((nY > this->height() - m_nBorder) && (nY < this->height()))
*result = HTBOTTOM; if ((nX > 0) && (nX < m_nBorder) && (nY > 0)
&& (nY < m_nBorder))
*result = HTTOPLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width())
&& (nY > 0) && (nY < m_nBorder))
*result = HTTOPRIGHT; if ((nX > 0) && (nX < m_nBorder)
&& (nY > this->height() - m_nBorder) && (nY < this->height()))
*result = HTBOTTOMLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width())
&& (nY > this->height() - m_nBorder) && (nY < this->height()))
*result = HTBOTTOMRIGHT; if (*result == HTCAPTION)
{
return false;
}
return true;
}
}
return QMainWindow::nativeEvent(eventType, message, result);
}

4.要实现窗口的正常功能,还需要对窗口的Flags进行一些设置,同时也要给父类设置,要不然会有问题的.



其中 Qt::FramelessWindowHint设置窗口为无边框,Qt::Window表示widegt为窗口,Qt::WindowMinimizeButtonHint 程序在任务栏被点击时能够显示/隐藏.

一些问题

1.把以上那些功能实现了,无边框窗口基本可以用了,至于如何用Qss美化,界面如何布局,那就看每个人了,反正可以自己进行定制

2.由于用到了windows下的消息机制,所以该实现只适用于Windows系统.虽然我在GitHub上找到不少可以跨平台的无边框窗口实现,但是都不是很完美,有兴趣的自己可以去GitHub上去看看.

3.目前的实现方法都会有一些问题,没有原本的好,但基本不影响使用,如果有需要自己也可以进行优化,所以问题不大.

完整项目代码

github: QtFrameLess

星期五女孩

Qt--无边框窗口完美(FrameLess)实现,包含缩放和移动功能重写。的更多相关文章

  1. Qt无边框窗口的移动、拉伸边框、鼠标滚轮缩放大小

    主要是处理窗口上鼠标的几个事件,具体代码请看下面的截图, 完整代码的下载链接在此:http://download.csdn.net/detail/beyond0824/9657110, 本示例代码中, ...

  2. 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性

    环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib .user32.lib 需要头文件:<dwmapi.h> .<windowsx. ...

  3. 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动

    在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...

  4. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  5. Qt无边框窗体-最大化时支持拖拽还原

    目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮 ...

  6. Qt5:无边框窗口拖动

    在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动 Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数 void Widget: ...

  7. Qt无边框窗体-模拟模态窗体抖动效果

    目录 一.概述 二.效果展示 三.功能实现 四.相关文章 原文链接:Qt无边框窗体-模拟模态窗体抖动效果 一.概述 用Qt开发windows客户端界面确实是一大利器,兼顾性能的同时,速度相对来说也不错 ...

  8. pyqt5设计无边框窗口(一)

    import sys from PyQt5 import QtGui,QtCore from PyQt5 import QtCore, QtGui, QtWidgets ############### ...

  9. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

随机推荐

  1. 理解 Flutter 的基础概念:Widget

    Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...

  2. anltr 解析MYSQL

    String sql = "select a as c,b as s,'zhange' F, 1/5 as e from t_order"; final MysqlQueryLex ...

  3. OpenStack云计算平台部署(单节点)

    环境配置 虚拟机(centos7 .内存8G.硬盘300G.处理器4核并开启intel vt-x,网络模式设置为NAT,虚拟机网络一定要设置好,并可以ping通baidu,不然有中途掉IP的情况发生) ...

  4. SDIO移植

    1.拷贝 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Utilities\STM32_EVAL\STM324x7I_EVAL 目录下的stm324x7i_eval_sdio_ ...

  5. 创建x11vnc系统进程

    〇.前言 为方便使用vnc,所以寻找到一个比较好用的vnc服务端那就是x11vnc,索性就创建了一个系统进程 一.环境 系统:银河麒麟v4-sp2-server 软件:x11vnc[linux下].V ...

  6. 硬核剖析Redis单线程为什么那么快?

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) Redis目前是使用率最高的内存库数据库,是企业应用开发的必备, ...

  7. 水晶报表导出pdf文件

    /// <summary> /// 导出pdf文件 /// </summary> /// <param name="mjsReport">报表文 ...

  8. Windows磁盘容量差异

    如果足够细心,你就能发现计算机管理里面显示的容量和我的电脑里面磁盘容量的显示有差异.我的电脑中显示的总会少一点. https://www.cnblogs.com/qishine/p/12125329. ...

  9. 重要参考步骤---ProxySQL实现读写分离

    MySQL配置主从同步文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/16295369.html ProxySQL实现读写分离与读负载均衡参考文档:https: ...

  10. MinIO管理员完整指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-admin-complete-guide MinIO Client(mc)提供了" adm ...