首页 > 其他分享 >qt自定义标题栏,纯代码实现,拿来即用,初始化列表时传入父窗口的this指针

qt自定义标题栏,纯代码实现,拿来即用,初始化列表时传入父窗口的this指针

时间:2024-02-11 23:00:14浏览次数:20  
标签:qt parent 鼠标 标题栏 TitleBar QWidget include event 自定义

// 头文件
#ifndef TITLEBAR_H
#define TITLEBAR_H

#include <QWidget>
#include <QPoint>  //坐标点
#include <QMouseEvent> //鼠标事件

class TitleBar : public QWidget
{
    Q_OBJECT
public:
    explicit TitleBar(QWidget *parent = nullptr);
    // 移动窗口的变量;
    bool m_isPressed; //鼠标按下标志
    QPoint m_startMovePos;  //开始移动的坐标点
protected:

    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
signals:

private:
    QWidget* m_parent;
};

#endif // TITLEBAR_H
// 源文件
#include "titlebar.h"
#include <qDebug>
TitleBar::TitleBar(QWidget* parent)
    : QWidget(parent)
    , m_isPressed(false)  //初始化鼠标按下标志为 false
    , m_parent(parent)

{
    // 设置唯一标识符
    this->setObjectName("TitleBar");
    // 拥有子窗口自己的样式
    setAttribute(Qt::WA_StyledBackground);
}

//鼠标移动事件
void TitleBar::mouseMoveEvent(QMouseEvent* event)
{
    //判断鼠标是否按下
    if (m_isPressed)
    {
        QPoint movePoint = event->globalPos() - m_startMovePos;
        QPoint widgetPos = m_parent->pos();
        m_startMovePos = event->globalPos();
        if(m_parent)
        {
            m_parent->move(widgetPos.x() + movePoint.x(), widgetPos.y() + movePoint.y());
        }
    }
}

//鼠标按下事件
void TitleBar::mousePressEvent(QMouseEvent* event)
{
     //获取鼠标相对于软件的坐标
    QPoint _mouseCurrent_software = event->pos();
     //获取鼠标相对于桌面的坐标
    QPoint _mouseCurrent_windows = event->globalPos();

    //标题栏的宽度
    int _titleBar_width = this->width();
    //标题栏的高度
    int _titleBar_height = this->height();
    if (!isMaximized())
    {
        //判断鼠标是否在标题栏范围内
        if (_mouseCurrent_software.x()<= _titleBar_width&&_mouseCurrent_software.y()<=_titleBar_height)
        {
            m_isPressed = true;
            m_startMovePos = event->globalPos();
        }
        else
        {
            m_isPressed = false;
        }
    }
}


//鼠标释放事件
void TitleBar::mouseReleaseEvent(QMouseEvent* event)
{
    m_isPressed = false;
}
// 使用
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
    , m_titleBar(new TitleBar(this))
{
    // 去掉标题栏和边框
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

    m_titleBar->show();

}

MainWindow::~MainWindow() {}

 

效果: 鼠标左键按住移动,跟随鼠标移动。

 

标签:qt,parent,鼠标,标题栏,TitleBar,QWidget,include,event,自定义
From: https://www.cnblogs.com/RedWetPlace/p/18013605

相关文章

  • elsa-core自定义Activity创建Bookmark人工任务完成
    //实现一个自定的activity用于人工处理的节点publicclassMyRunTask:Activity<object>{[Input(Description="Thenameofthetaskbeingrequested.")]publicInput<string>TaskName{get;set;}=default!;///<inheritdo......
  • Qt6.0开发 第二章 GUI程序设计基础
    第二章GUI程序设计基础窗口相关文件按照第一章所给提示创建一个新project,我们得到了下面的代码:widget.h:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{......
  • 记录一下自定义博客园主题过程
    前言以前使用的都是默认的博客园主题,最近刚好有空,着手定制以下自己的博客园主题。最终效果参考当前的博客,如果看不到则需要在博客园首页头像处悬停关闭简洁模式思路是尽量保持原有结构,不进行破坏性改动,以css样式为主(当前只添加了两个js方法用于主题切换和判断是否在随笔阅读......
  • 【SpringBootStarter】自定义全局加解密组件
    【SpringBootStarter】目的了解SpringBootStarter相关概念以及开发流程实现自定义SpringBootStarter(全局加解密)了解测试流程优化最终引用的效果:<dependency><groupId>com.xbhog</groupId><artifactId>globalValidation-spring-boot-starter</artifactId>......
  • 零基础入门Vue之拘元遣将——其他常用指令&自定义指令
    回首在零基础入门Vue之梦开始的地方——插值语法我记录了v-bind、v-on、v-model的学习在零基础入门Vue之Tobeornottobe——条件渲染我记录了v-if、v-else-if、v-else、v-show的学习在零基础入门Vue之影分身之术——列表渲染&渲染原理浅析我记录了v-for的学习为了推......
  • 【实用技巧】【Mybatis】自定义的动态 SQL
    1 前言平时我们可能会拼接SQL,尤其是做一些报表的开发或者连表查询的时候,当条件发生变更或者关联关系需要改变的时候,就需要更改代码里的SQL,所以我这里弄了一个简易版的基于Mybatis的动态SQL调用。2 实现主要是Mybatis的动态SQL://controller层@Override@PostMapp......
  • osg qt场景中节点去除透明
     osgqt场景中节点的透明属性消除 {osg::ref_ptr<osg::StateSet>stateState=north_wall_geode->getOrCreateStateSet();stateState->setMode(GL_BLEND,osg::StateAttribute::ON);stateState->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON);......
  • docker---dockerfile自定义镜像指令
    dockerfile指令FROM#指定所基于的镜像名称及其标签来创建新镜像。RUN#在镜像中执行命令。ADD#将文件或目录复制到镜像中。可以使用URL作为源文件。COPY#与ADD类似,将文件或目录复制到镜像中,但不支持URL作为源文件。CMD#指定运行容器时要执行的命令,如果在......
  • pattern和validator自定义校验规则
    data(){constcheckNum=(rule,value,callback)=>{   if(value||value===0){    if(value<1||value>99){     returncallback(newError('次数取值范围1~99'))    }    if(!Number.isInteger(Number(value)......
  • 记录一次Electron程序打包自定义安装包
    首先下载nsNiuNiu打包程序下面就是下载之后解压的文件夹内容,注明了主要文件/文件夹的用途将使用electron-builder打包的文件内容拷贝到FilesToInstall,也就是文件夹下面的内容拷贝过去修改.\SetupScripts\nim\nim_setup.nsi中的内容,这个文件是nsis的打包主文件,在其中设......