位置: IT常识 - 正文

Qt--无边框窗口完美(FrameLess)实现,包含缩放和移动功能重写。(qt无边框窗口设计)

发布时间:2024-01-23
#前言 Qt原本的窗口虽然可以通过QSS样式进行美化,但是只是对客户区有用,对于客户区是无效的。所以想做出一个比较好看的程序,还得自己重写实现无边框窗口。 Qt实现无边框其实一句代码就可以,但是窗口自带的缩放,移动功和关闭功能都会没有,需要自己重写。 setWindowFlags(Qt::Frame ... 前言Qt原本的窗口虽然可以通过QSS样式进行美化,但是只是对客户区有用,对于客户区是无效的。所以想做出一个比较好看的程序,还得自己重写实现无边框窗口。Qt实现无边框其实一句代码就可以,但是窗口自带的缩放,移动功和关闭功能都会没有,需要自己重写。setWindowFlags(Qt::FramelessWindowHint);重写无边框窗口

推荐整理分享Qt--无边框窗口完美(FrameLess)实现,包含缩放和移动功能重写。(qt无边框窗口设计),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:Qt无边框窗口被覆盖,qt无边框窗口,qt无边框窗口拖动,qt无边框窗口最大化,Qt无边框窗口被覆盖,Qt无边框窗口被覆盖,qt无边框窗口缩放,qt无边框窗口缩放,内容如对您有帮助,希望把文章链接给更多的朋友!

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(); }}Qt--无边框窗口完美(FrameLess)实现,包含缩放和移动功能重写。(qt无边框窗口设计)

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

星期五女孩

本文链接地址:https://www.jiuchutong.com/zhishi/304761.html 转载请保留说明!

上一篇:织梦DEDECMS栏目后台设置显示,栏目前台怎么隐藏(织梦cms不更新了吗)

下一篇:c语言中数组的三种类型(c语言中数组的定义和使用)

  • 清算时实收资本怎么计算
  • 投资性房地产递延所得税资产怎么算
  • 100%直接控制的母子公司间划转股权或资产
  • 公司的会议议程怎么写
  • 预交所得税比较多怎么办?
  • 资产剥离类型
  • 土地不动产登记证办理流程
  • 员工内部跑步活动费用怎么做分录?
  • 不收汇样品的会计分录
  • 个人所得税生育险
  • 技术培训费发票怎么开
  • 进项税超过销项怎么办?
  • 企业所得税汇算交所得税如何做账务处理
  • 税收预测表怎么填写
  • 注册资本印花税按实缴还是认缴
  • 境内企业技术转让 增值税
  • 非营利组织免税条件发生变化
  • 收的的挂靠费一般是几个点
  • 社保已申报但未缴费有什么影响
  • 转让投资性房地产收到售价款
  • 汇算清缴工资调增,账务要处理吗
  • linux系统安装浏览器
  • 小规模减免的税额怎么做账
  • 现金日记账需要本月合计吗
  • 广告传媒公司的成本是什么
  • 生产车间设备检测费计入什么科目
  • 苹果mac电脑自带的软件
  • win11 insider preview怎么升级正式版
  • 换购商品分录怎么做
  • powerremind.exe
  • php 赋值
  • php异常处理和错误处理
  • 收到金融服务费怎么转账给别人
  • thinkphp删除文件
  • php转换器
  • php 自动加载类
  • 联营企业和合营企业是什么意思
  • 带附件的目录
  • 工会经费计算表
  • 酒店打印要钱吗
  • mysql配置文件my.ini如何配置
  • 银行存款为负数可以结账吗
  • 服务合同开什么发票
  • 提取法定盈余公积金的比例是多少
  • 生产经营所得如何申请退税
  • 预提费用处理
  • 招聘一年以内
  • 建筑工程拨款申请模板
  • 申报抵扣的进项税额怎么算
  • 企业如何建账之类的账目
  • 公司对帐的内容怎么写
  • sql server in()
  • ubuntu 连不上网如何排查原因
  • win8连接网络
  • linux常用小技巧
  • centos7访问百度的命令
  • instmsiw.exe进程简介
  • centos关闭开机启动项
  • aspnet_admin.exe进程是安全的吗 aspnet_admin进程信息查询
  • win10高对比度设置点了没反应
  • ubuntu20.04.1安装
  • ubuntu配置vsftpd
  • centos7打开命令行
  • centos7如何安装telnet
  • Centos 6.5 64位双网卡绑定教程
  • mac笔记本如何设置不黑屏
  • windows where命令
  • [置顶]电影名字《收件人不详》
  • js开发android应用
  • jQuery+ajax的资源回收处理机制分析
  • shell脚本 教程
  • nodejs处理excel
  • jQuery tagsinput在h5邮件客户端中应用详解
  • js 三元
  • python 命令
  • jqueryfor
  • python 判断中文字符
  • 陕西省税务局机关服务中心
  • 煤炭资源税税率减半对上市公司影响
  • 地税局网上报税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号