当前位置: 首页 > news >正文

天津时时彩网站制作/整站优化案例

天津时时彩网站制作,整站优化案例,类做秋霞的网站,全包装修一、前言 实现的效果为:通过黑色矩形框预操作,鼠标释放时更新窗口。效果图如下: 1.功能 1.1 已实现功能 8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏 1.2 待开发功能 拖动到…

一、前言

实现的效果为:通过黑色矩形框预操作,鼠标释放时更新窗口。效果图如下:

1.功能

1.1 已实现功能

  1. 8个方向的缩放
  2. 标题栏拖动
  3. 标题栏双击最大化/正常窗口
  4. 窗口最小尺寸
  5. 预操作框颜色与背景色互补
  6. 多屏幕
  7. 默认标题栏

1.2 待开发功能

  1. 拖动到屏幕四周进行半屏全屏。

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 实现思路

  1. 首先关于无边框窗口,通过Qt标志处理:
setWindowFlags(Qt::FramelessWindowHint);
  1. 然后关于缩放和拖动,与网上大多数实现一致,通过九宫格法实现:

当鼠标位于不同区域时,触发不同的操作。

  1. 而对于预处理框,则是通过一个覆盖整个屏幕的透明窗口,并重写paintEvent在其中绘制一个rect。

2.3 实现难点

1.首先是九宫格的思路,了解了思路之后,实现就比较简单了

2.对于预处理框,首先是需要以全屏幕作为geometry,否则会导致拖不到非主屏幕,或者位置错误灯问题

3.其次是预处理框要实现window类似的与背景色互补(而非纯色),需要获取全屏幕图片作为背景绘制到预操作框,然后再通过QPainter::RasterOp_SourceAndNotDestination模式取反。

4.最后就是对于多屏幕的位置,缩放比灯。

二、代码

目录结构如下:

其中:

  • cursorTransform是用于鼠标位置和方向的计算
  • framelessData则是一些全局变量
  • framelessHelper则是对外的接口,
  • titleBar表示默认标题栏
  • transparentRect则是实现预操作框

详细代码如下:

#include "cursorTransform.h"
#include <QDebug>AreaType 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(x<=FrameLessData::borderThickness){if(y<=FrameLessData::borderThickness)return AreaType::LeftTopArea;else if(y>=h-FrameLessData::borderThickness)return AreaType::LeftBottomArea;elsereturn AreaType::LeftArea;}//rightelse if(x>=w-FrameLessData::borderThickness){if(y<=FrameLessData::borderThickness)return AreaType::RightTopArea;else if(y>=h-FrameLessData::borderThickness)return AreaType::RightBottomArea;elsereturn AreaType::RightArea;}else{//centerif(y<=FrameLessData::borderThickness)return AreaType::TopArea;else if(y<=FrameLessData::titleHeight)return AreaType::TitleArea;else if(y>=h-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:cursorType=Qt::SizeFDiagCursor;break;case AreaType::RightTopArea:case AreaType::LeftBottomArea:cursorType=Qt::SizeBDiagCursor;break;case AreaType::TopArea:case AreaType::BottomArea:cursorType=Qt::SizeVerCursor;break;case AreaType::LeftArea:case AreaType::RightArea:cursorType=Qt::SizeHorCursor;break;default:break;}return cursorType;
}void CursorTransform::calculateRect(AreaType type,QRect &rect, const QPoint &lastPos,const QPoint &newPos)
{int xOff=0,yOff=0,wOff=0,hOff=0;int posXOff=newPos.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()-xOff<=FrameLessData::minWidth)xOff=0;else if(rect.left()<newPos.x() && xOff<0)xOff=0;if(rect.width()+wOff<=FrameLessData::minWidth)wOff=0;else if(rect.right()>newPos.x() && wOff>0)wOff=0;if(rect.height()-yOff<=FrameLessData::minHeight)yOff=0;else if(rect.top()<newPos.y() && yOff<0)yOff=0;if(rect.height()+hOff<=FrameLessData::minHeight)hOff=0;else if(rect.bottom()>newPos.y() && hOff>0)hOff=0;//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 <QRect>class 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.h"int FrameLessData::borderThickness=4;
int FrameLessData::titleHeight=30;
int FrameLessData::minHeight=355;
int FrameLessData::minWidth=220;
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 <QDebug>FrameLessHelper::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 ret=false;switch (event->type()) {case QEvent::MouseButtonDblClick:   //double clickret = onDbClickEvent(static_cast<QMouseEvent *>(event));break;case QEvent::MouseButtonPress:ret = onMousePressEvent(static_cast<QMouseEvent *>(event));break;case QEvent::MouseButtonRelease:ret = onMouseReleaseEvent(static_cast<QMouseEvent *>(event));break;case QEvent::MouseMove:ret = onMoveEvent(static_cast<QMouseEvent *>(event));break;case QEvent::HoverMove:case QEvent::HoverEnter:ret = onHoverEvent(watched,static_cast<QHoverEvent *>(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 w=static_cast<QWidget *>(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(areatype==AreaType::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(type<AreaType::CenterArea){//resizem_widgetOperator = WidgetOperator::Resize;// not start show rectm_transparentRect->setRect(m_widget->frameGeometry());m_transparentRect->onMousePressEvent(event,type);return true;}else if(type==AreaType::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_widgetOperator==WidgetOperator::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_widgetOperator==WidgetOperator::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 gPosX=evPos.x();double step = m_widget->geometry().width()/3.0;double left=0;if(gPosX>step*2){left=step*3-rect.width();}else if(gPosX>step && gPosX<=step*2){left=gPosX-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 <QPalette>int iconSize=30;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_isMax=false;}else{m_maxBtn->setIcon(QIcon(":/img/normal.png"));m_isMax=true;}
}
#ifndef TITLEBAR_H
#define TITLEBAR_H#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QSpacerItem>class TitleBar : public QWidget
{Q_OBJECT
public:explicit TitleBar(QWidget *parent = nullptr,bool isMax=false);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 <QList>TransparentRect::TransparentRect(QWidget *parent): QWidget(parent), m_areaType(AreaType::None)
{setWindowFlag(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);
}void TransparentRect::setRect(const QRect &rect)
{m_rect=rect;
}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 xOff=0,yOff=0,wOff=0,hOff=0;int posXOff=newPos.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()-xOff<=FrameLessData::minWidth)xOff=0;else if(m_rect.left()<event->globalPos().x() && xOff<0)xOff=0;if(m_rect.width()+wOff<=FrameLessData::minWidth)wOff=0;else if(m_rect.right()>event->globalPos().x() && wOff>0)wOff=0;if(m_rect.height()-yOff<=FrameLessData::minHeight)yOff=0;else if(m_rect.top()<event->globalPos().y() && yOff<0)yOff=0;if(m_rect.height()+hOff<=FrameLessData::minHeight)hOff=0;else if(m_rect.bottom()>event->globalPos().y() && hOff>0)hOff=0;//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_areaType=AreaType::None;//释放pixmap,m_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 rect=m_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.h"class TransparentRect : public QWidget
{Q_OBJECT
public:TransparentRect(QWidget *parent=nullptr);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_scaled=1.0;double m_startInch;
};#endif // TRANSPARENTRECT_H
cmake_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 <QDebug>MainWindow::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.h"QT_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

相关文章:

Qt跨平台无边框窗口探索记录

一、前言 实现的效果为&#xff1a;通过黑色矩形框预操作&#xff0c;鼠标释放时更新窗口。效果图如下&#xff1a; 1.功能 1.1 已实现功能 8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏 1.2 待开发功能 拖动到…...

概念解析 | 电磁计算的新篇章:智能电磁计算

注1&#xff1a;本文系“概念解析”系列之一&#xff0c;致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是&#xff1a;智能电磁计算。 电磁计算的新篇章&#xff1a;智能电磁计算 随着人工智能的飞速发展&#xff0c;我们正处在一个信息爆炸的时代。各个领域&a…...

SpringBoot-1-Spring Boot实战:快速搭建你的第一个应用,以及了解原理

SpringBoot-1-Spring Boot实战&#xff1a;快速搭建你的第一个应用&#xff0c;以及了解原理 今日内容 SpringBootWeb入门 前言 我们在之前介绍Spring的时候&#xff0c;已经说过Spring官方(Spring官方)提供很多开源项目&#xff0c;点击projects&#xff0c;看到spring家族…...

Web服务器基础 http协议

文章目录 1.Web基础1.1MIME1.2 URI 和 URL1.2.1定义1.2.2两者的区别 2.静态资源和动态资源2.1 静态资源2.2 动态资源 3.HTTP协议3.1HTTP协议简介3.2HTTP协议的版本及区别3.2.1http协议版本3.2.2http1.0和1.1的区别 3.3HTTP请求报文3.4HTTP请求访问的过程1、建立连接&#xff1a…...

采用 SVG 实现 web 绘图软件的技术分享

背景 前端技术 使用 svg.js 及全家桶的组件实现 svg 绘图的 web 软件。 MySql8 词语定义 图纸&#xff1a;在页面上绘制的内容整体整体叫做图纸&#xff0c;业务上图纸是具有重要业务意义的概念。 对象&#xff1a;图纸上的业务元素的最小概念。 难点-技术背景 当时遇到…...

Qt --- QTimer

在Qt开发界面的时候&#xff0c;非常多的时候都得使用定时器&#xff0c;定时器具体可以干什么呢&#xff1f;比如&#xff1a;控制时钟、定时改变样式、改变进度等。。。说到这里&#xff0c;经常使用QQ&#xff0c;而不同的时段都会显示不同的背景&#xff0c;我认为如果用Qt…...

计算机终端核心安全配置规范

声明 本文是学习 政务计算机终端核心配置规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 范围 本标准提出了政务计算机终端核心配置的基本概念和要求&#xff0c;规定了核心配置的自动化实现方法&#xff0c;规范了核心配置实施流程。 本标准适…...

【Spring Boot】什么是深度优先遍历与广度优先遍历?用Spring Boot项目举例说明。

深度优先遍历&#xff08;Depth First Search&#xff0c;DFS&#xff09;和广度优先遍历&#xff08;Breadth First Search&#xff0c;BFS&#xff09;是图的遍历算法。其中&#xff0c;深度优先遍历从某个起始点开始&#xff0c;先访问一个节点&#xff0c;然后跳到它的一个…...

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…...

栈和队列OJ题

有效括号问题&#xff1a; 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的…...

36k字从Attention讲解Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…...

网站怎么选择适合的服务器

IDC数据中心大致分为T1、T2、T3、T4 T1&#xff1a;基本机房基础设施&#xff08;可用性99.671%、年平均故障时间28.8小时&#xff09; 1) T1 基本数据中心拥有非冗余容量组件&#xff0c;以及一个单一的非冗余分配路径来为关键环境提供服务。T1 基础设施包括&#xff1a;IT …...

http协议和HTTP编程流程

目录 1、http协议 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;使用的端口 &#xff08;3&#xff09;长连接和短连接 &#xff08;4&#xff09;常见web服务器 2、https&#xff08;443&#xff09; 3、浏览器连接服务器编程 1、http协议 &#xff08;超文…...

【NPM】包的指令

npm 安装的包可以根据其用途和作用进行分类&#xff0c;一般可以分为以下几种类型&#xff1a; 普通依赖&#xff08;Regular Dependencies&#xff09;&#xff1a; 这些是你项目中的实际依赖项&#xff0c;用于构建、运行或扩展你的应用程序。这些依赖会被包含在你的应用程序…...

音频4A算法导论

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 音频4A算法是? 音频4A算法是指自动增益控制(Automatic Gain Control, AGC)、自动噪声抑制(Automatic Noise Suppression, ANS)和自动回声消除(Automatic Echo Cancellation, AEC),主动降噪ANC(Active Noi…...

SecureBridge安全文件下载的组件Crack

SecureBridge安全文件下载的组件Crack SecureBridge包括SSH、SSL和SFTP客户端和服务器组件。它使用SSH或SSL安全传输层协议和加密消息语法来保护任何TCP流量&#xff0c;这些协议为客户端和服务器提供身份验证、强数据加密和数据完整性验证。SecureBridge组件可以与数据访问组件…...

进程同步

目录 临界区&#xff08;Critical Section&#xff09;: 互斥量&#xff08;Mutex&#xff09;: 信号量&#xff08;Semaphore&#xff09;: 事件&#xff08;Event&#xff09;: 进程同步的四种方法 临界区&#xff08;Critical Section&#xff09;: 通过对多线程的串行…...

Prometheus+Grafana+AlertManager监控Linux主机状态

文章目录 PrometheusGrafanaAlertManager监控平台搭建开始监控Grafana连接Prometheus数据源导入Grafana模板监控Linux主机状态 同系列文章 PrometheusGrafanaAlertManager监控平台搭建 Docker搭建并配置Prometheus Docker拉取并配置Grafana Docker安装并配置Node-Exporter …...

UI设计第一步,在MasterGo上开展一个新项目

我们都知道&#xff0c;一个完整的项目&#xff0c;要经历创建团队、搭建组件库、应用规范以及管理设计资产&#xff0c;那么今天小编就在MasterGo中带你从0到1开展一个全新的项目。 你一定遇到过这种情况&#xff0c;同团队的设计师&#xff0c;由于使用不同版本或不同软件&a…...

【校招VIP】TCP/IP模型之常用协议和端口

考点介绍&#xff1a; 大厂测试校招面试里经常会出现TCP/IP模型的考察&#xff0c;TCP/IP协议是网络基础知识&#xff0c;是互联网的基石&#xff0c;不管你是做开发、运维还是信息安全的&#xff0c;TCP/IP 协议都是你绕不过去的一环&#xff0c;程序员需要像学会看书写字一样…...

Spring统一功能处理

1. AOP存在的问题 获取参数复杂AOP的规则相对简单 2. 拦截器 2.1. 应用(以登录为例) 2.1.1. 自定义拦截器 新建interceptor文件夹 import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http…...

搭建CFimagehost私人图床,实现公网远程访问的详细指南

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…...

Python的logging.config模块

要使用Python的logging.config模块记录一个月的日志数据&#xff0c;你可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;导入必要的模块&#xff1a; import logging import logging.config import datetime创建一个配置文件&#xff0c;例如logging.ini&#xff0c;用…...

【2023】LeetCode HOT 100——滑动窗口子串

目录 1. 无重复字符的最长子串1.1 C++实现1.2 Python实现1.3 时空分析2. 找到字符串中所有字母异位词2.1 C++实现2.2 Python实现2.3 时空分析3. 和为 K 的子数组3.1 C++实现3.2 Python实现3.3 时空分析4. 滑动窗口最大值4.1 C++实现4.2 Python实现4.3 时空分析5. 最小覆盖子串5…...

【云卓笔记】mavlink java文件

根据飞控提供的xml文件来生成的 生成的就是这样的java文件 准备工作: Mavlink协议生成 参考 1.安装mavlink : 使用MAVLink工具的要求是 Python 3.3 (recommended) or Python 2.7 Python future模块 (可选) PythonTklnter模块(如果需要使用图形用户界面)。 环境变量PYTHO…...

电机控制软件框架

应用层包括main 主函数模块&#xff0c;ISR 中断处理函数模块、时基Systick 模块和BLDC 应用接口模块&#xff1b;算法层包括BLDC Algorithm 模块和PID control 模块&#xff1b;驱动层&#xff08;Driver layer&#xff09;&#xff1a;包括GD32Fxx_Standard_peripheral libra…...

SCCB与IIC的异同及FPGA实现的注意事项

文章目录 前言一、信号线二、SCCB数据传输格式三、SCCB写&#xff08;与IIC完全一致&#xff09;四、SCCB读五、SCCB和IIC的区别 前言 IIC接口有比较广泛的应用&#xff0c;而SCCB&#xff08;Serial Camera Control Bus&#xff0c;串行摄像头控制总线&#xff09;是由OV&…...

【开发】安防监控视频智能分析平台新功能:安全帽/反光衣/安全带AI识别详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检…...

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…...

栈和队列在数据结构中的应用

文章目录 理解栈和队列的概念及其特点栈的应用和操作队列的应用和操作结论 &#x1f389;欢迎来到数据结构学习专栏~探索栈和队列在数据结构中的应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;…...