专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Qt高级Qt自定义标题栏

  QWidget及其子类窗体组件的标题栏受操作系统的控制,即标题栏的界面风格与操作系统的主题风格相同,工程实践中需要开发者自行定一,达到美化应用程序界面的目的。
  一、Qt自定义标题栏实现
  1、自定义标题栏的功能
  自定义标题栏需要完成功能如下:
  (1)自定义标题栏需要包含最小化按钮、最大化按钮、关闭按钮、标题标签、图标标签等图形元素。
  (2)标题栏的拖拽。
  (3)鼠标双击标题栏实现窗体的最大化、最小化。
  2、自定义标题栏的界面布局
  自定义标题栏的界面布局如下:
  3、标题栏拖拽功能的实现
  窗体的拖拽平移过程如下图:
  当鼠标在窗体的标题栏按下并移动时,窗体会按照鼠标移动的轨迹进行平移。因此,窗体每次移动都是在当前位置按照鼠标移动的矢量进行移动。标题栏拖拽功能的实现需要实现mousePressEvent、mouseMoveEvent、mouseReleaseEvent三个事件处理函数。
  MouseEvent中的globalPos()函数返回的是相对屏幕的位置坐标,而pos()则是返回鼠标在当前控件(即捕获该鼠标事件的控件)中的位置。QWidget窗体的geometry()。topLeft()则返回的是当前窗体的左上角在屏幕中的位置。startPoseventglobalPos();鼠标的全局初始位置,按下时记住curWindowPosgeometry()。topleft();窗体的全部位置,移动时endPoseventglobalPos();鼠标按下发生移动之后的位置,移动时move(curWindowPos(startPosendPos));根据矢量移动方向是初始位置减去末位置,移动时startPosendPos;将初始位置记为上次末位置,然后执行直到释放拖拽,移动时
  实现代码如下:voidTitleBar::mousePressEvent(QMouseEventevent){鼠标左键按下事件if(eventbutton()Qt::LeftButton){记录鼠标左键状态mleftButtonPressedtrue;记录鼠标在屏幕中的位置mstarteventglobalPos();}}voidTitleBar::mouseMoveEvent(QMouseEventevent){持续按住才做对应事件if(mleftButtonPressed){将父窗体移动到父窗体原来的位置加上鼠标移动的位置:eventglobalPos()mstartparentWidget()move(parentWidget()geometry()。topLeft()eventglobalPos()mstart);将鼠标在屏幕中的位置替换为新的位置mstarteventglobalPos();}}voidTitleBar::mouseReleaseEvent(QMouseEventevent){鼠标左键释放if(eventbutton()Qt::LeftButton){记录鼠标状态mleftButtonPressedfalse;}}
  4、标题栏双击实现最大化、最小化
  鼠标双击事件处理函数mouseDoubleClickEvent实现如下:voidTitleBar::mouseDoubleClickEvent(QMouseEventevent){mmaximizeButtonclick();}
  最大化、最小化、关闭按钮的槽函数如下:voidTitleBar::onClicked(){QPushButtonpButtonqobjectcastQPushButton(sender());QWidgetpWindowthiswindow();if(pWindowisTopLevel()){if(pButtonmminimizeButton){pWindowshowMinimized();}elseif(pButtonmmaximizeButton){pWindowisMaximized()?pWindowshowNormal():pWindowshowMaximized();}elseif(pButtonmcloseButton){pWindowclose();}}}
  二、Qt自定义窗体基类示例
  1、自定义窗体基类的功能
  自定义窗体基类的功能如下:
  (1)自定义标题栏。
  (2)增加内容组件,内容组件内部的界面布局完全由具体的用户决定。
  2、自定义窗体基类的实现
  TitleBar。h文件:ifndefTITLEBARHdefineTITLEBARHincludeQWidgetincludeQPushButtonincludeQLabelincludeQHBoxLayoutincludeQEventincludeQMouseEventincludeQApplicationincludeQPointincludeQPixmapincludeQStringbrief标题栏界面组件authorclassTitleBar:publicQWidget{QOBJECTpublic:explicitTitleBar(QWidgetparentNULL);brief设置标题栏标题paramtitle,参数,设置的标题voidsetWindowTitle(constQStringtitle);brief设置标题栏的图标paramiconPath,参数,图标的路径voidSetTitleBarIcon(constQStringiconPath);protected:brief鼠标双击事件处理函数paramevent,参数,事件note双击标题栏进行界面的最大化还原virtualvoidmouseDoubleClickEvent(QMouseEventevent);brief鼠标按下事件处理函数paramevent,参数,事件note按下鼠标左键virtualvoidmousePressEvent(QMouseEventevent);brief鼠标移动事件处理函数paramevent,参数,事件note移动鼠标virtualvoidmouseMoveEvent(QMouseEventevent);brief鼠标释放事件处理函数paramevent,参数,事件note释放鼠标virtualvoidmouseReleaseEvent(QMouseEventevent);brief事件过滤处理器paramobj,参数paramevent,参数,事件return成功返回true,失败返回falsenote设置标题、图标virtualbooleventFilter(QObjectobj,QEventevent);brief最大化还原voidupdateMaximize();protectedslots:brief最小化、最大化还原、关闭按钮点击时响应的槽函数voidonClicked();private:QLabelmiconLabel;QLabelmtitleLabel;QPushButtonmminimizeButton;QPushButtonmmaximizeButton;QPushButtonmcloseButton;QPointmstart;起始点QPointmend;结束点boolmleftButtonPressed;鼠标左键按下标记};endifTITLEBARH
  TitleBar。cpp文件:includeTitleBar。hTitleBar::TitleBar(QWidgetparent):QWidget(parent){setFixedHeight(30);setWindowFlags(Qt::FramelessWindowHint);miconLabelnewQLabel(this);miconLabelsetFixedSize(20,20);miconLabelsetScaledContents(true);mtitleLabelnewQLabel(this);mtitleLabelsetSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);mminimizeButtonnewQPushButton(this);mminimizeButtonsetFixedSize(27,22);mminimizeButtonsetObjectName(minimizeButton);mmaximizeButtonnewQPushButton(this);mmaximizeButtonsetFixedSize(27,22);mmaximizeButtonsetObjectName(maximizeButton);mcloseButtonnewQPushButton(this);mcloseButtonsetFixedSize(27,22);mcloseButtonsetObjectName(closeButton);QHBoxLayoutlayoutnewQHBoxLayout;layoutaddWidget(miconLabel);layoutaddStretch(1);layoutaddWidget(mtitleLabel);layoutaddStretch(1);layoutaddWidget(mminimizeButton);layoutaddWidget(mmaximizeButton);layoutaddWidget(mcloseButton);setLayout(layout);setProperty(titleBar,true);setObjectName(titleBar);connect(mminimizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));connect(mmaximizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));connect(mcloseButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));}voidTitleBar::setWindowTitle(constQStringtitle){mtitleLabelsetAlignment(Qt::AlignCenter);mtitleLabelsetText(title);}voidTitleBar::SetTitleBarIcon(constQStringiconPath){QPixmapmap(iconPath);miconLabelsetPixmap(map);}voidTitleBar::mouseDoubleClickEvent(QMouseEventevent){mmaximizeButtonclick();}voidTitleBar::mousePressEvent(QMouseEventevent){鼠标左键按下事件if(eventbutton()Qt::LeftButton){记录鼠标左键状态mleftButtonPressedtrue;记录鼠标在屏幕中的位置mstarteventglobalPos();}}voidTitleBar::mouseMoveEvent(QMouseEventevent){持续按住才做对应事件if(mleftButtonPressed){将父窗体移动到父窗体原来的位置加上鼠标移动的位置:eventglobalPos()mstartparentWidget()move(parentWidget()geometry()。topLeft()eventglobalPos()mstart);将鼠标在屏幕中的位置替换为新的位置mstarteventglobalPos();}}voidTitleBar::mouseReleaseEvent(QMouseEventevent){鼠标左键释放if(eventbutton()Qt::LeftButton){记录鼠标状态mleftButtonPressedfalse;}}boolTitleBar::eventFilter(QObjectobj,QEventevent){switch(eventtype()){设置标题caseQEvent::WindowTitleChange:{QWidgetpWidgetqobjectcastQWidget(obj);if(pWidget){mtitleLabelsetText(pWidgetwindowTitle());returntrue;}}设置图标caseQEvent::WindowIconChange:{QWidgetpWidgetqobjectcastQWidget(obj);if(pWidget){QIconiconpWidgetwindowIcon();miconLabelsetPixmap(icon。pixmap(miconLabelsize()));returntrue;}}窗口状态变化、窗口大小变化caseQEvent::WindowStateChange:caseQEvent::Resize:updateMaximize();returntrue;}returnQWidget::eventFilter(obj,event);}voidTitleBar::updateMaximize(){QWidgetpWindowthiswindow();if(pWindowisTopLevel()){boolbMaximizepWindowisMaximized();if(bMaximize){mmaximizeButtonsetToolTip(tr(Restore));mmaximizeButtonsetProperty(maximizeProperty,restore);}else{mmaximizeButtonsetProperty(maximizeProperty,maximize);mmaximizeButtonsetToolTip(tr(Maximize));}mmaximizeButtonsetStyle(QApplication::style());}}voidTitleBar::onClicked(){QPushButtonpButtonqobjectcastQPushButton(sender());QWidgetpWindowthiswindow();if(pWindowisTopLevel()){if(pButtonmminimizeButton){pWindowshowMinimized();}elseif(pButtonmmaximizeButton){pWindowisMaximized()?pWindowshowNormal():pWindowshowMaximized();}elseif(pButtonmcloseButton){pWindowclose();}}}
  QWindowBase。h文件:ifndefQWINDOWBASEHdefineQWINDOWBASEHincludeQFrameincludeQWidgetincludeQVBoxLayoutincludeTitleBar。hbrief界面组件基类noteQWindowBase界面组件主要用作顶层窗口,对于非顶层窗口的界面组件使用QWidget。classQWindowBase:publicQFrame{QOBJECTpublic:QWindowBase(QFrameparentNULL);brief设置标题paramtitle,输入参数,标题内容voidsetWindowTitle(constQStringtitle);brief设置标题栏的图标paramiconPath,输入参数,图标资源路径voidSetTitleBarIcon(constQStringiconPath);brief获取内容组件对象指针return返回QWidgetQWidgetcontentWidget();brief设置标题栏高度paramh,输入参数,标题栏高度voidsetWindowTitleHeight(inth);private:QWidgetmcontentWidget;内容组件TitleBarmtitleBar;标题栏QVBoxLayoutmlayout;布局管理器};endifQWINDOWBASEH
  QWindowBase。cpp文件:includeQWindowBase。hQWindowBase::QWindowBase(QFrameparent):QFrame(parent){setWindowFlags(windowFlags()Qt::FramelessWindowHint);mtitleBarnewTitleBar(this);mcontentWidgetnewQWidget(this);mcontentWidgetsetObjectName(Contents);mlayoutnewQVBoxLayout;mlayoutaddWidget(mtitleBar);mlayoutaddWidget(mcontentWidget);mlayoutsetSpacing(0);mlayoutsetContentsMargins(0,0,0,0);setLayout(mlayout);}voidQWindowBase::setWindowTitle(constQStringtitle){mtitleBarsetWindowTitle(title);}voidQWindowBase::SetTitleBarIcon(constQStringiconPath){mtitleBarSetTitleBarIcon(iconPath);}QWidgetQWindowBase::contentWidget(){returnmcontentWidget;}voidQWindowBase::setWindowTitleHeight(inth){mtitleBarsetFixedHeight(h);}
  CommonHelper。h文件:ifndefCOMMONHELPERHdefineCOMMONHELPERHincludeQStringincludeQFileincludeQApplicationincludeQDebugincludeQColorincludeQPalettebrief通用功能辅助类classCommonHelper{public:brief为应用程序设置QSS样式表paramfilepath,输入参数,QSS文件路径staticvoidsetStyleSheet(constQStringfilepath){加载样式文件QFileqss(filepath);if(qss。open(QFile::ReadOnly)){QStringstylesheetQLatin1String(qss。readAll());QStringpaletteColorstylesheet。mid(20,7);qAppsetPalette(QPalette(QColor(paletteColor)));qAppsetStyleSheet(stylesheet);}}};endifCOMMONHELPERH
  点击领取Qt学习资料视频教程链接
  main。cpp文件:includeQApplicationincludeCommonHelper。hincludeQWindowBase。hincludeQPushButtonincludeQVBoxLayoutincludeQHBoxLayoutincludeQTreeViewintmain(intargc,charargv〔〕){QApplicationa(argc,argv);QWindowBasew;w。setWindowTitle(WidgetBase);QPushButtonbutton1newQPushButton(OK);QHBoxLayouthLayout1newQHBoxLayout;hLayout1addStretch(1);hLayout1addWidget(button1);QVBoxLayoutlayoutnewQVBoxLayout;QTreeViewtreeViewnewQTreeView;layoutaddWidget(treeView);layoutaddLayout(hLayout1);layoutaddStretch(1);w。contentWidget()setLayout(layout);w。setWindowTitleHeight(40);w。show();CommonHelper::setStyleSheet(:qsslightblue。qss);returna。exec();}
  工程文件:QTcoreguigreaterThan(QTMAJORVERSION,4):QTwidgetsTARGETTitleBarDemoTEMPLATEappThefollowingdefinemakesyourcompileremitwarningsifyouuseanyfeatureofQtwhichhasbeenmarkedasdeprecated(theexactwarningsdependonyourcompiler)。PleaseconsultthedocumentationofthedeprecatedAPIinordertoknowhowtoportyourcodeawayfromit。DEFINESQTDEPRECATEDWARNINGSYoucanalsomakeyourcodefailtocompileifyouusedeprecatedAPIs。Inordertodoso,uncommentthefollowingline。YoucanalsoselecttodisabledeprecatedAPIsonlyuptoacertainversionofQt。DEFINESQTDISABLEDEPRECATEDBEFORE0x060000disablesalltheAPIsdeprecatedbeforeQt6。0。0SOURCESmain。cppTitleBar。cppQWindowBase。cppHEADERSTitleBar。hCommonHelper。hQWindowBase。hRESOURCESTitileBarDemo。qrc
  工程目录结构:
  3、自定义窗体基类结果展示
  运行结果:

户外live汉服巡游赏灯猜谜盐田元宵氛围感拉满!快乐的时光总是短暂上班一周啦大家的节后综合症恢复了吗?奸笑俗话说过完元宵,才算年一年一度的元宵佳节到啦春节假期没玩够?这个周末来盐田充充电吧!赏花灯逛市集品美食看表演琳琅满目的潮趣免费游!敦煌向全国医务人员发出热情邀请来源新甘肃每日甘肃网讯(新甘肃每日甘肃网记者杨红丽)记者从敦煌市文体广电和旅游局获悉,敦煌市积极落实优惠政策,从2月1日起启动我在春天等您全国医护人员免票游敦煌活动。具体时间为2月境外媒体述评中国经济反弹对全球复苏贡献愈发明显据彭博新闻社网站1月31日报道,中国经济反弹势必将为全球经济注入一剂急需的强心针,从而抵消欧洲的疲软和美国正在出现的衰退阴影。报道说,IMF总裁克里斯塔利娜格奥尔基耶娃曾表示,中国央媒看海南经济日报首个商业航天发射场为何建在海南地理位置方面,海南纬度低距赤道近运载效率高安全性方面,因为各级火箭落区均为海洋,不经过人口稠密地区交通方面,海南文昌发射场可以利用船舶运输大型运载火箭。地方支持也是重要原因。据了解董事长1个月两见马云,年出栏生猪850万头,正大在华布局有多大?近期,马云会见泰国首富的新闻刷屏。据媒体1月30日报道,阿里巴巴创始人马云日前在香港与泰国首富正大集团资深董事长谢国民及谢国民的三儿子正大CEO谢镕仁会面。一个月内两会马云,正大国制造业景气回升显经济韧性国家统计局发布的最新数据显示,1月份制造业PMI指数为50。1,比上月上升3。1个百分点,结束三连跌重返50临界线上方。反映制造业景气水平较快回升,也显示出我国经济景气水平呈明显回这条头鱼拍出58。8万元!2月2日,2023济宁第八届太白湖捕鱼节开幕。活动现场,锣鼓喧天,人头攒动,热闹非凡,吸引了众多游客前来太白湖打卡。大家欢聚一堂,共同期盼风调雨顺,年年有鱼。头鱼是第一网捕捞的鱼里到武昌紫阳公园,做一场有关花的梦春意已悄悄来临如果你在紫阳公园闲逛就会发现湖畔的梅花开了它的绽放也透露出一个讯息这一年的赏花季又要开始了!墙角数枝梅,凌寒独自开遥知不是雪,为有暗香来紫阳公园大片的蜡梅正值盛花期满2023年2月3日焦点图2月2日是第27个世界湿地日,国家林业和草原局发布我国新指定的18处国际重要湿地名录。其中,广西有两处,分别是桂林会仙喀斯特国际重要湿地和北海滨海国际重要湿地。图为广西桂林会仙喀斯古海州玉带河古海州玉带河是一条非常古老的河流,历史攸久像一根玉带一样,西起海州蔷薇河,向东延伸直接入海流,全长八公里,以前的玉带河,是一条非常重要的运输水道,河里经常有船行驶,有时候还会看到河疑似索尼Xperia1V背面谍照曝光取消ToF模块和RGBIR传感器近期,社交平台上出现了一张可能是索尼下一代旗舰手机Xperia1V的背面谍照,背面的相机模组虽然依旧位于左上角呈现纵向排列,不过相较于Xperia1IV的相机模组设计还是有些较为明
双11倒计时3天!凯诘华扬多准三波段脉冲式促收策略解读客群如何获取货品怎么推广?对于众多品牌商家来说,在天猫双11期间一直有这么个经营难题。能够洞察商家痛点并拿出解决办法的平台,总能走在行业前列。如今成为国内领先数智经营阵地的阿里妈妈强如腾讯,也不得不面对的事腾讯再强,但形势也比人强这是业内人士对这家如猛虎般企业的评价。腾讯现在面对国内的游戏市场逐渐有些力不从心,现在将目标盯准了国外。据了解,腾讯自2021下半年以来就一边裁撤国内非核心挑战经典模型!悟空号发现宇宙新奥妙暗物质粒子探测卫星悟空号发现宇宙新奥妙!这一次,它的发现挑战了经典的宇宙线传播模型。我国综合类学术期刊科学通报英文版近日刊发悟空号国际合作组的一篇新成果,研究人员利用卫星在2016比特币挖矿成本上涨意味着比特币矿工在第三季度难以获利2022年第三季度对海外的比特币挖矿运营商来说没有任何好处。北美和欧洲的能源问题以及当前的虚拟货币市场状况为虚拟货币带来了噩耗,比特币行情的下跌叫停很多矿工。哈希率指数最新的第三季一个方法,教你给孩子戒掉拉拉裤家里有小宝宝的朋友们,您家宝宝的尿不湿戒了吗?育儿的烦恼孩子越来越大,带孩子的家长们是不是都开始操心把戒拉拉裤事宜提上日程了呢?目前我家金宝1岁11个月,已经在过去的这个初秋顺利将自然拼读干货图解总结6大核心热搜问题No。1自然拼读的概念?自然拼读法(Phonics)简单来说,是学习字母及字母组合的发音规律,即字母字母组合在什么情况下应该发什么音。比如当孩子知道字母组合sh发,字母i发i,字母从女排核心到备受质疑!张常宁为任性付出代价,球迷态度需改正近日,许多球迷都在关注朱婷这位顶级球星的最新动态,朱婷今年即将年满28岁,作为一位顶级的球星,她的手腕伤病时刻牵动着中国球迷的心。前不久,朱婷参与了意大利斯坎迪奇俱乐部的发布会,在SpringIOC容器源码分析Spring最重要的概念是IOC和AOP,本篇文章其实就是要带领大家来分析下Spring的IOC容器。既然大家平时都要用到Spring,怎么可以不好好了解Spring呢?阅读本文并禁闭求生蚂蚁克星突变获取方法禁闭求生游戏中玩家会有很多的突变效果可以获取,不同的突变效果会有不同的获取条件,同时造成的效果也是不同的,可能有玩家还不知道蚂蚁克星这个效果要怎么获得,下面小编就给大家整理了具体的戴笠身亡后蒋介石失声痛哭,清算其遗产时,却又开始破口大骂1946年3月17日,一架飞机突然撞到江宁县岱山山腰上,三天之后,人们在暴雨中发现了戴笠的尸体。谁也没能想到,让无数人闻风丧胆的大特务戴笠,居然会以这种方式草草的结束一生。戴笠死后黑龙江省的区划变动,12个地级市之一,双鸭山市为何有8个区县?在之前的文章中,小编给大家详细介绍了东三省的一些地域城市的变迁发展,要知道我国的历史悠久,很多的城市并不是像现在这个样子,今天给大家介绍一下东三省的双鸭山市的地域变迁规划,素材寻找
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网