数据库查询网站建设,宁波网站制作优化服务公司,网站代理被抓,如何做好网站建设和宣传一、前言
实现的效果为#xff1a;通过黑色矩形框预操作#xff0c;鼠标释放时更新窗口。效果图如下#xff1a; 1.功能
1.1 已实现功能
8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏
1.2 待开发功能
拖动到…一、前言
实现的效果为通过黑色矩形框预操作鼠标释放时更新窗口。效果图如下 1.功能
1.1 已实现功能
8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏
1.2 待开发功能
拖动到屏幕四周进行半屏全屏。
1.3 存在的问题
1.QWebEngineView
从测试效果来看对于普通widget效果较好但是如果是嵌入了QWebEngineView且其位于窗口四周就会出现问题。
其主要原因在于当事件进入QWebEngineView后会被其child(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget)吃掉导致后续事件不再进入主窗口从而无法触发我们的代码。这时我们还可以遍历QWebEngineView的children将事件安装到主窗口 auto childs view-children();for(auto child:childs){child-installEventFilter(this);}
但是这样显得太笨重了。而且即使如此鼠标样式的修改也会被QWebEngineView刷掉。因此对于QWebEngineView下是存在一些问题的。
2.多屏幕拖动时从低缩放比拖到高缩放比释放时会闪烁一次目前没有进一步分析原因。
2.探索的过程
2.1 关于无边框缩放的实现方式
目前网上无非两种方式
a)通过nativeEvent()实现。c - Qt/Windows, resizable frameless window - Stack Overflow
b)通过窗口的eventFilter()直接实现。
但是问题是前者基于windows接口不跨平台而后者则会出现抖动。
本文则是基于第二种方式并参考windows窗口的拖动方式通过预操作框避免抖动的问题。
2.2 实现思路
首先关于无边框窗口通过Qt标志处理
setWindowFlags(Qt::FramelessWindowHint);
然后关于缩放和拖动与网上大多数实现一致通过九宫格法实现 当鼠标位于不同区域时触发不同的操作。
而对于预处理框则是通过一个覆盖整个屏幕的透明窗口并重写paintEvent在其中绘制一个rect。
2.3 实现难点
1.首先是九宫格的思路了解了思路之后实现就比较简单了
2.对于预处理框首先是需要以全屏幕作为geometry否则会导致拖不到非主屏幕或者位置错误灯问题
3.其次是预处理框要实现window类似的与背景色互补(而非纯色)需要获取全屏幕图片作为背景绘制到预操作框然后再通过QPainter::RasterOp_SourceAndNotDestination模式取反。
4.最后就是对于多屏幕的位置缩放比灯。
二、代码
目录结构如下 其中
cursorTransform是用于鼠标位置和方向的计算framelessData则是一些全局变量framelessHelper则是对外的接口titleBar表示默认标题栏transparentRect则是实现预操作框
详细代码如下
#include cursorTransform.h
#include QDebugAreaType CursorTransform::calculateCursorType(const QSize size, const QPoint pos)
{//TODO:minsizeauto w size.width();auto h size.height();auto x pos.x();auto y pos.y();//leftif(xFrameLessData::borderThickness){if(yFrameLessData::borderThickness)return AreaType::LeftTopArea;else if(yh-FrameLessData::borderThickness)return AreaType::LeftBottomArea;elsereturn AreaType::LeftArea;}//rightelse if(xw-FrameLessData::borderThickness){if(yFrameLessData::borderThickness)return AreaType::RightTopArea;else if(yh-FrameLessData::borderThickness)return AreaType::RightBottomArea;elsereturn AreaType::RightArea;}else{//centerif(yFrameLessData::borderThickness)return AreaType::TopArea;else if(yFrameLessData::titleHeight)return AreaType::TitleArea;else if(yh-FrameLessData::borderThickness)return AreaType::BottomArea;elsereturn AreaType::CenterArea;}}Qt::CursorShape CursorTransform::AreaType2CursorShape(AreaType type)
{Qt::CursorShape cursorType(Qt::ArrowCursor);switch (type) {case AreaType::LeftTopArea:case AreaType::RightBottomArea:cursorTypeQt::SizeFDiagCursor;break;case AreaType::RightTopArea:case AreaType::LeftBottomArea:cursorTypeQt::SizeBDiagCursor;break;case AreaType::TopArea:case AreaType::BottomArea:cursorTypeQt::SizeVerCursor;break;case AreaType::LeftArea:case AreaType::RightArea:cursorTypeQt::SizeHorCursor;break;default:break;}return cursorType;
}void CursorTransform::calculateRect(AreaType type,QRect rect, const QPoint lastPos,const QPoint newPos)
{int xOff0,yOff0,wOff0,hOff0;int posXOffnewPos.x()-lastPos.x();int posYOff newPos.y()-lastPos.y();switch (type) {case AreaType::LeftTopArea:xOff posXOff;yOff posYOff;break;case AreaType::TopArea:yOff posYOff;break;case AreaType::RightTopArea:yOff posYOff;wOff posXOff;break;case AreaType::LeftArea:xOff posXOff;break;case AreaType::RightArea:wOff posXOff;break;case AreaType::LeftBottomArea:xOff posXOff;hOff posYOff;break;case AreaType::BottomArea:hOff posYOff;break;case AreaType::RightBottomArea:wOff posXOff;hOff posYOff;break;case AreaType::TitleArea: //moverect.moveTopLeft(rect.topLeft()QPoint(posXOff,posYOff));break;default:break;}//min judget:if(rect.width()-xOffFrameLessData::minWidth)xOff0;else if(rect.left()newPos.x() xOff0)xOff0;if(rect.width()wOffFrameLessData::minWidth)wOff0;else if(rect.right()newPos.x() wOff0)wOff0;if(rect.height()-yOffFrameLessData::minHeight)yOff0;else if(rect.top()newPos.y() yOff0)yOff0;if(rect.height()hOffFrameLessData::minHeight)hOff0;else if(rect.bottom()newPos.y() hOff0)hOff0;//resize:rect.setTop(rect.top()yOff);rect.setLeft(rect.left()xOff);rect.setWidth(rect.width()wOff);rect.setHeight(rect.height()hOff);
}
#ifndef CURSORTRANSFORM_H
#define CURSORTRANSFORM_H
#include framelessData.h
#include QRectclass CursorTransform
{
public:static AreaType calculateCursorType(const QSize size, const QPoint pos);static enum Qt::CursorShape AreaType2CursorShape(AreaType type);static void calculateRect(AreaType type,QRect rect,const QPoint lastPos,const QPoint newPos);
private:
};#endif // CURSORTRANSFORM_H#include framelessData.hint FrameLessData::borderThickness4;
int FrameLessData::titleHeight30;
int FrameLessData::minHeight355;
int FrameLessData::minWidth220;
QColor FrameLessData::borderColor(Qt::white);
QColor FrameLessData::transparentRectBkground(Qt::transparent);
enum Qt::PenStyle FrameLessData::borderStyle(Qt::SolidLine);#ifndef FRAMELESSDATA_H
#define FRAMELESSDATA_H
#include QColor
#include QPoint
#include QSize//透明矩形的属性class FrameLessData{
public:static int borderThickness;static int titleHeight;static int minHeight;static int minWidth;static QColor borderColor;static QColor transparentRectBkground;static enum Qt::PenStyle borderStyle;
};enum class AreaType
{LeftTopArea,TopArea,RightTopArea,LeftArea,RightArea,LeftBottomArea,BottomArea,RightBottomArea,CenterArea,TitleArea,None
};enum class WidgetOperator
{None,Resize,Move
};#endif // FRAMELESSDATA_H#include framelessHelper.h
#include cursorTransform.h
#include QEvent
#include QSize
#include QPoint
#include QCursor
#include QWidget
#include QPainter
#include QDebugFrameLessHelper::FrameLessHelper(QWidget *widget): m_widget(widget), m_transparentRect(new TransparentRect()), m_widgetOperator(WidgetOperator::None), m_isMove(false)
#ifdef TITLEBAR, m_titleBar(nullptr)
#endif
{m_transparentRect-setRect(m_widget-frameGeometry());
#ifdef TITLEBAR//if use titlem_titleBar new TitleBar(m_widget);connect(m_titleBar,TitleBar::minimumSizeClick,this,FrameLessHelper::onMinClick);connect(m_titleBar,TitleBar::showNormalClick,this,FrameLessHelper::onMaxClick);connect(m_titleBar,TitleBar::closeClick,this,FrameLessHelper::onCloseClick);
#endif
}bool FrameLessHelper::eventFilter(QObject *watched, QEvent *event)
{int retfalse;switch (event-type()) {case QEvent::MouseButtonDblClick: //double clickret onDbClickEvent(static_castQMouseEvent *(event));break;case QEvent::MouseButtonPress:ret onMousePressEvent(static_castQMouseEvent *(event));break;case QEvent::MouseButtonRelease:ret onMouseReleaseEvent(static_castQMouseEvent *(event));break;case QEvent::MouseMove:ret onMoveEvent(static_castQMouseEvent *(event));break;case QEvent::HoverMove:case QEvent::HoverEnter:ret onHoverEvent(watched,static_castQHoverEvent *(event));break;default:break;}//触发返回trueif(ret)return ret;return QObject::eventFilter(watched,event);
}void FrameLessHelper::setBorderThickness(int thickness)
{FrameLessData::borderThickness thickness;
}void FrameLessHelper::setTitleHeight(int height)
{FrameLessData::titleHeight height;
}void FrameLessHelper::setMinHeight(int height)
{FrameLessData::minHeight height;
}void FrameLessHelper::setMinWidth(int width)
{FrameLessData::minWidth width;
}
#ifdef TITLEBAR
QWidget *FrameLessHelper::getTitleBar()
{return m_titleBar;
}void FrameLessHelper::onMinClick()
{m_widget-showMinimized();
}void FrameLessHelper::onMaxClick()
{if(m_widget-isFullScreen())m_widget-showNormal();elsem_widget-showFullScreen();
}void FrameLessHelper::onCloseClick()
{m_widget-close();
}
#endif
bool FrameLessHelper::onHoverEvent(QObject *watched,QHoverEvent *event)
{//操作的时候不响应hoverif(m_widgetOperator!WidgetOperator::None || m_widget-isFullScreen())return false;//hover moveauto areatype CursorTransform::calculateCursorType(m_widget-size(),event-pos());auto wstatic_castQWidget *(watched);if(w)w-setCursor(CursorTransform::AreaType2CursorShape(areatype));elsem_widget-setCursor(CursorTransform::AreaType2CursorShape(areatype));return true;//hover leave - Qt::ArrowCursor//not need
}bool FrameLessHelper::onDbClickEvent(QMouseEvent *event)
{if(event-button()!Qt::LeftButton){return false;}auto areatype CursorTransform::calculateCursorType(m_widget-size(),event-globalPos()-m_widget-pos());if(areatypeAreaType::TitleArea){if(m_widget-isFullScreen()){m_widget-showNormal();}else{m_widget-showFullScreen();}
#ifdef TITLEBARm_titleBar-onMaxClick();
#endif}return true;
}bool FrameLessHelper::onMousePressEvent(QMouseEvent *event)
{if(event-button()!Qt::LeftButton){return false;}auto type CursorTransform::calculateCursorType(m_widget-size(),event-globalPos()-m_widget-pos());if(typeAreaType::CenterArea){//resizem_widgetOperator WidgetOperator::Resize;// not start show rectm_transparentRect-setRect(m_widget-frameGeometry());m_transparentRect-onMousePressEvent(event,type);return true;}else if(typeAreaType::TitleArea){//movem_widgetOperator WidgetOperator::Move;if(!m_widget-isFullScreen())m_transparentRect-setRect(m_widget-geometry());else{m_transparentRect-setRect(calMaxMoveRect(event-globalPos()));}m_transparentRect-onMousePressEvent(event,type);return true;}return false;
}bool FrameLessHelper::onMoveEvent(QMouseEvent *event)
{if(m_widgetOperatorWidgetOperator::None ||(m_widgetOperator WidgetOperator::Resize m_widget-isFullScreen())){return false;}#ifdef TITLEBARif(m_widget-isFullScreen())m_titleBar-onMaxClick();
#endifm_isMove true;m_transparentRect-show();m_transparentRect-onMoveEvent(event,event-globalPos()-m_widget-pos());return false;
}bool FrameLessHelper::onMouseReleaseEvent(QMouseEvent *event)
{if(event-button()!Qt::LeftButton || m_widgetOperatorWidgetOperator::None){return false;}m_transparentRect-onMouseReleaseEvent(event);m_transparentRect-hide();if(m_isMove){if(m_widget-isFullScreen())m_widget-showNormal();auto rect m_transparentRect-getRect();m_widget-move(rect.topLeft());m_widget-resize(rect.size());}m_isMove false;m_widgetOperator WidgetOperator::None;return false;
}QRect FrameLessHelper::calMaxMoveRect(const QPoint evPos)
{//最大化时拖动标题栏的规则宽度分为3份鼠标位于左侧则向左上角对齐右侧则向右上角对齐中间部分则按中间对齐auto rect m_widget-normalGeometry();rect.moveTop(0);double gPosXevPos.x();double step m_widget-geometry().width()/3.0;double left0;if(gPosXstep*2){leftstep*3-rect.width();}else if(gPosXstep gPosXstep*2){leftgPosX-rect.width()/2.0;}rect.moveLeft(left);return rect;
}
#ifndef FRAMELESSHELPER_H
#define FRAMELESSHELPER_H
#include transparentRect.h
#include titleBar.h
#include cursorTransform.h#include QObject
#include QMouseEvent
#include QHoverEvent
#include QRect
#include QWidget/*
FrameLessHelper
1.管理窗口无边框功能
2.输入为QWidget(构造)和QEvent(eventFilter)
*/
class FrameLessHelper : public QObject
{Q_OBJECT
public:FrameLessHelper(QWidget *widget);bool eventFilter(QObject *watched, QEvent *event) override;void setBorderThickness(int thickness);void setTitleHeight(int height);void setMinHeight(int height);void setMinWidth(int width);
#ifdef TITLEBARQWidget *getTitleBar();void onMinClick();void onMaxClick();void onCloseClick();
#endif
private:bool onHoverEvent(QObject *watched,QHoverEvent *event);bool onDbClickEvent(QMouseEvent *event);bool onMousePressEvent(QMouseEvent *event);bool onMoveEvent(QMouseEvent *event);bool onMouseReleaseEvent(QMouseEvent *event);QRect calMaxMoveRect(const QPoint evPos);//代理窗口QWidget *m_widget;//预拖动窗口TransparentRect *m_transparentRect;enum WidgetOperator m_widgetOperator;bool m_isMove;
#ifdef TITLEBARTitleBar *m_titleBar;
#endif
};
#endif // FRAMELESSHELPER_H#include titleBar.h
#include QIcon
#include QPaletteint iconSize30;TitleBar::TitleBar(QWidget *parent,bool isMax): QWidget{parent}, m_minBtn{new QPushButton(this)}, m_maxBtn{new QPushButton(this)}, m_closeBtn{new QPushButton(this)}, m_hLayout{new QHBoxLayout(this)}, m_spacer{new QSpacerItem(500,30,QSizePolicy::Expanding)}, m_isMax{isMax}
{m_minBtn-setIcon(QIcon(:/img/min.png));QString maxPic m_isMax?:/img/normal.png::/img/max.png;m_maxBtn-setIcon(QIcon(maxPic));m_closeBtn-setIcon(QIcon(:/img/close.png));connect(m_minBtn,QPushButton::clicked,this,TitleBar::minimumSizeClick);connect(m_maxBtn,QPushButton::clicked,this,TitleBar::showNormalClick);connect(m_maxBtn,QPushButton::clicked,this,TitleBar::onMaxClick);connect(m_closeBtn,QPushButton::clicked,this,TitleBar::closeClick);m_minBtn-resize(iconSize,iconSize);m_maxBtn-resize(iconSize,iconSize);m_maxBtn-resize(iconSize,iconSize);m_hLayout-addSpacerItem(m_spacer);m_hLayout-addWidget(m_minBtn);m_hLayout-addWidget(m_maxBtn);m_hLayout-addWidget(m_closeBtn);m_hLayout-setSpacing(0);m_hLayout-setContentsMargins(0,0,0,0);QPalette palette(this-palette());palette.setColor(QPalette::Background, QColor(100,100,100));this-setAutoFillBackground(true);this-setPalette(palette);
}void TitleBar::onMaxClick()
{if(m_isMax){m_maxBtn-setIcon(QIcon(:/img/max.png));m_isMaxfalse;}else{m_maxBtn-setIcon(QIcon(:/img/normal.png));m_isMaxtrue;}
}#ifndef TITLEBAR_H
#define TITLEBAR_H#include QWidget
#include QPushButton
#include QHBoxLayout
#include QSpacerItemclass TitleBar : public QWidget
{Q_OBJECT
public:explicit TitleBar(QWidget *parent nullptr,bool isMaxfalse);void onMaxClick();
signals:void minimumSizeClick();void showNormalClick();void closeClick();private:QPushButton *m_minBtn;QPushButton *m_maxBtn;QPushButton *m_closeBtn;QHBoxLayout *m_hLayout;QSpacerItem *m_spacer;bool m_isMax;
};#endif // TITLEBAR_H#include transparentRect.h
#include framelessData.h
#include QMouseEvent
#include QDesktopWidget
#include QDebug
#include QPainter
#include QPen
#include QScreen
#include QGuiApplication
#include QListTransparentRect::TransparentRect(QWidget *parent): QWidget(parent), m_areaType(AreaType::None)
{setWindowFlag(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);
}void TransparentRect::setRect(const QRect rect)
{m_rectrect;
}QRect TransparentRect::getRect() const
{return m_rect;
}void TransparentRect::onMousePressEvent(QMouseEvent *event,AreaType type)
{m_lastPos event-pos();//auto screens QGuiApplication::screens();QRect rect;//QPainter painter(m_pixmap);for(auto s:screens){auto geom s-geometry();rect | geom;//auto pixmap s-grabWindow(0, geom.x(), geom.y(), geom.width(), geom.height());//static int i 0;//QFile file(QString(./test%1.png).arg(i));//file.open(QIODevice::WriteOnly);//pixmap.save(file);//file.close();//painter.drawPixmap(s-geometry(), pixmap);}//painter.end();m_startInch QGuiApplication::screenAt(event-globalPos())-logicalDotsPerInch();setGeometry(rect);m_pixmap QGuiApplication::primaryScreen()-grabWindow(0, rect.x(), rect.y(), rect.width(), rect.height());m_areaType type;#if 0//QFile file(./test.png);file.open(QIODevice::WriteOnly);m_pixmap.save(file);file.close();
#endif // 0
}void TransparentRect::onMoveEvent(QMouseEvent *event,const QPoint newPos)
{m_scaled QGuiApplication::screenAt(event-globalPos())-logicalDotsPerInch()/ m_startInch;// auto newPos event-pos();int xOff0,yOff0,wOff0,hOff0;int posXOffnewPos.x()-m_lastPos.x();int posYOff newPos.y()-m_lastPos.y();switch (m_areaType) {case AreaType::LeftTopArea:xOff posXOff;yOff posYOff;break;case AreaType::TopArea:yOff posYOff;break;case AreaType::RightTopArea:yOff posYOff;wOff posXOff;break;case AreaType::LeftArea:xOff posXOff;break;case AreaType::RightArea:wOff posXOff;break;case AreaType::LeftBottomArea:xOff posXOff;hOff posYOff;break;case AreaType::BottomArea:hOff posYOff;break;case AreaType::RightBottomArea:wOff posXOff;hOff posYOff;break;case AreaType::TitleArea: //movem_rect.moveTopLeft(m_rect.topLeft()QPoint(posXOff,posYOff));break;default:break;}//min judget:if(m_rect.width()-xOffFrameLessData::minWidth)xOff0;else if(m_rect.left()event-globalPos().x() xOff0)xOff0;if(m_rect.width()wOffFrameLessData::minWidth)wOff0;else if(m_rect.right()event-globalPos().x() wOff0)wOff0;if(m_rect.height()-yOffFrameLessData::minHeight)yOff0;else if(m_rect.top()event-globalPos().y() yOff0)yOff0;if(m_rect.height()hOffFrameLessData::minHeight)hOff0;else if(m_rect.bottom()event-globalPos().y() hOff0)hOff0;//resize:m_rect.setTop(m_rect.top()yOff);m_rect.setLeft(m_rect.left()xOff);m_rect.setWidth(m_rect.width()wOff);m_rect.setHeight(m_rect.height()hOff);m_lastPos newPos;update();
}void TransparentRect::onMouseReleaseEvent(QMouseEvent *event)
{m_areaTypeAreaType::None;//释放pixmapm_pixmap QPixmap();//重绘触发paintEvent否则会有闪动//注意要在hide之前调用。repaint();
}void TransparentRect::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing | QPainter::Antialiasing);painter.setBackground(FrameLessData::transparentRectBkground);painter.drawPixmap(0, 0, m_pixmap);QPen pen(FrameLessData::borderStyle);pen.setWidth(FrameLessData::borderThickness);pen.setColor(FrameLessData::borderColor);painter.setPen(pen);//背景色取反要求color必须是whitepainter.setCompositionMode(QPainter::RasterOp_SourceAndNotDestination);//rect位置相对与this的geometryauto rectm_rect;rect.moveTopLeft(rect.topLeft()-geometry().topLeft());rect.setWidth(rect.width()*m_scaled);rect.setHeight(rect.height()*m_scaled);painter.drawRect(rect);painter.end();
}
#ifndef TRANSPARENTRECT_H
#define TRANSPARENTRECT_H
#include QWidget
#include framelessData.hclass TransparentRect : public QWidget
{Q_OBJECT
public:TransparentRect(QWidget *parentnullptr);void setRect(const QRect rect);QRect getRect() const;void onMousePressEvent(QMouseEvent *event,AreaType type);void onMoveEvent(QMouseEvent *event,const QPoint pos);void onMouseReleaseEvent(QMouseEvent *event);
protected:virtual void paintEvent(QPaintEvent *event) override;
private:QRect m_rect;QPoint m_lastPos;AreaType m_areaType;QPixmap m_pixmap;double m_scaled1.0;double m_startInch;
};#endif // TRANSPARENTRECT_Hcmake_minimum_required(VERSION 3.5)project(frameLessHelper VERSION 0.1 LANGUAGES CXX)add_definitions(-DTITLEBAR)
#add_definitions(-DRUBBER)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets WebEngineWidgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets WebEngineWidgets)file(GLOB PROJECT_SOURCES *.cpp *.h *.ui framelessHelper/*.*)if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)qt_add_executable(frameLessHelperMANUAL_FINALIZATION${PROJECT_SOURCES})
# Define target properties for Android with Qt 6 as:
# set_property(TARGET frameLessHelper APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()if(ANDROID)add_library(frameLessHelper SHARED${PROJECT_SOURCES})
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android)else()add_executable(frameLessHelper${PROJECT_SOURCES}framelessHelper/titleBarImg.qrcwebview.h webview.cpp)endif()
endif()target_link_libraries(frameLessHelper PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::WebEngineWidgets)set_target_properties(frameLessHelper PROPERTIESMACOSX_BUNDLE_GUI_IDENTIFIER my.example.comMACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}MACOSX_BUNDLE TRUEWIN32_EXECUTABLE TRUE
)install(TARGETS frameLessHelperBUNDLE DESTINATION .LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)if(QT_VERSION_MAJOR EQUAL 6)qt_finalize_executable(frameLessHelper)
endif()#include mainwindow.h
#include ./ui_mainwindow.h
#include QGridLayout
#include QWebEngineView
#include QFrame
#include webview.h
#include QDebugMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow), m_frameHelper(new FrameLessHelper(this))
{ui-setupUi(this);setWindowFlags(Qt::FramelessWindowHint);installEventFilter(this);
#ifdef TITLEBAR//titleBarauto titleBar m_frameHelper-getTitleBar();if(titleBar){QGridLayout *layout new QGridLayout(centralWidget());layout-setSpacing(0);layout-setContentsMargins(0,0,0,0);layout-addWidget(titleBar,0,0,0,0,Qt::AlignTop);titleBar-setFixedHeight(32);#if 0WebView *view new WebView();view-load(QUrl(https:www.baidu.com));auto childs view-children();for(auto child:childs){
// if(child-metaObject()-className()QString(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget))child-installEventFilter(this);}view-installEventFilter(this);
#elseQFrame *view new QFrame();
#endiflayout-addWidget(view,1,0);}setMouseTracking(true);
#endif
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{return m_frameHelper-eventFilter(watched,event);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QMainWindow
#include framelessHelper/framelessHelper.hQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();bool eventFilter(QObject *watched, QEvent *event) override;
private:Ui::MainWindow *ui;FrameLessHelper *m_frameHelper;
};
#endif // MAINWINDOW_H源码
https://download.csdn.net/download/weixin_40953784/88248380