当鼠标位于 Qt 窗口的自定义小部件上时,如何移动整个窗口?

2024-04-20

假设我有一个自定义小部件并将其添加到 qt 的主窗口中。

如您所见,红色区域是自定义小部件。我想要做的是,当鼠标在红色区域按下并移动时,整个窗口也会移动。

我知道如何简单地实施mousePressEvent and mouseMoveEvent;但是当处理带有自定义小部件的窗口时,我不知道当鼠标在自定义小部件上按下时如何移动整个窗口。

另外我想提一下,我只希望当鼠标在红色区域中按下并移动时窗口可移动,而当鼠标在主窗口区域的其余部分中按下并移动时,不会发生任何事情。

这就是我的CustomWidget类看起来像:

CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
    setFixedSize(50, 50);
    setStyleSheet("QWidget { background: red; }");
}

void CustomWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter painter(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}

void CustomWidget::mousePressEvent(QMouseEvent *event)
{
    xCoord = event->x();
    yCoord = event->y();
}

void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{
    move(event->globalX() - xCoord, event->globalY() - yCoord);
}

如果您想知道为什么我要这样做,在我的应用程序中,我隐藏了标题栏并自己绘制了一个自定义标题栏。但是窗口是不可移动的,所以我想在按下鼠标并在标题栏上移动时使整个窗口可移动。
希望我能清楚地解释自己。


要从任何小部件移动窗口,必须能够访问该窗口,为此我们使用该方法window()返回顶层,不需要分离坐标x() and y(),下面的代码实现了解决方案:

自定义widget.h

#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H

#include <QWidget>

class CustomWidget : public QWidget
{
    Q_OBJECT
public:
    explicit CustomWidget(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
private:
    QPoint startPos;
};

#endif // CUSTOMWIDGET_H

自定义widget.cpp

#include "customwidget.h"

#include <QMouseEvent>
#include <QPainter>
#include <QStyleOption>

CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
    setFixedSize(50, 50);
    setStyleSheet("QWidget { background: red; }");
}

void CustomWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter painter(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}

void CustomWidget::mousePressEvent(QMouseEvent *event)
{
    startPos = event->pos();
    QWidget::mousePressEvent(event);
}

void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{
    QPoint delta = event->pos() - startPos;
    QWidget * w = window();
    if(w)
        w->move(w->pos() + delta);
    QWidget::mouseMoveEvent(event);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当鼠标位于 Qt 窗口的自定义小部件上时,如何移动整个窗口? 的相关文章

  • Word Automation - 禁用警报

    我正在自动化 Word 因此我想抑制所有警报 Word Application word new Word Application word DisplayAlerts Microsoft Office Interop Word WdAle
  • 为什么隐式类型转换没有警告?

    我终于发现了程序中的一个错误 该错误是由返回类型的隐式类型转换引起的 即使g Wall对此没有任何警告 我想知道是否有什么办法可以快速找出这种无意识的错误 include
  • Active Directory:获取用户所属的组

    我想找到用户所属的组列表 我尝试了几种解决方案http www codeproject com KB system everythingInAD aspx http www codeproject com KB system everyth
  • C# 中的通用 foreach 循环

    给出以下代码的编译器告诉我 使用未分配的局部变量 x 有什么想法吗 public delegate Y Function
  • 使 C++ 在模板函数的特定实例化上编译失败

    我正在开发一个具有模板功能的项目 如下所示 template
  • LogicalOperationStack 与 .Net 4.5 中的异步不兼容吗

    Trace CorrelationManager LogicalOperationStack允许具有嵌套逻辑操作标识符 其中最常见的情况是日志记录 NDC 它是否仍然可以使用async await 这是一个简单的例子 使用LogicalFl
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • 这些比较应该返回什么?

    我有一个使用 string compare string string 对某些值进行排序的应用程序 我不明白的是为什么 1022 比较小于 10 23 而 10 23 比较小于 1024 是否有特定于 值的东西导致了这个结果 string
  • 如何查看某个函数以 3 秒的间隔被调用了多少次?

    我想检查我的函数在 3 秒内可以运行多少次 我写了这段代码 include
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • C 预处理器“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp”未通过完整性检查

    在使用 Xcode 11 3 的 macOS Mojave 上 我有一个基于 Autotool 的第三方库 在终端中运行我的构建脚本时构建得很好 但在 Xcode 中运行时失败Run Script步骤为 BuildScript Showin
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • 企业库 CacheFactory.GetCacheManager 抛出空引用

    我正在尝试将使用 1 1 版本的企业库缓存块的应用程序转换为 2 0 版本 我认为我真正遇到的问题是不同 EntLib 部分的配置被分成几个文件 显然 这曾经是由ConfigurationManager 部分处理程序 但现在已经过时 取而代
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • 如何为 Blazor MapFallbackToFile() 生成正确的错误

    我有一个项目想要用作 Web API 和 Blazor wasm UI 该 API 也可以从其他项目访问 因此我希望该 API 向消费者提供有用的错误详细信息 我现在通过使用该网站来实现这两个目的MapFallbackToFile 方法 但
  • 使用 MVVM 绑定 Xamarin.Forms 中的属性

    我在使用 Xamarin Forms 和 MVVM 制作游戏时遇到问题 游戏中有一艘由用户控制的潜艇 并且有水雷掉落 因此用户必须避开这些水雷 这些地雷是在运行时使用 2 个计时器生成的 因此我用 XAML 中的 CollectionVie
  • 索引 getter 中的 IndexOutOfRangeException

    在我的索引属性中 我检查索引是否超出范围 如果是的话 我抛出一个IndexOutOfBoundsException 当我运行代码分析器 在 VS12 中 时 它抱怨 CA1065 意外位置出现意外异常 参考CA1065的描述 仅 Syste
  • C# StreamReader 使用分隔符保存到数组

    我有一个文本文件 其中包含制表符分隔的数据 我在 C 应用程序中需要的是从文本文件中读取一行并将它们保存到一个数组中 在每个位置将它们分开 t 然后我对下一行做同样的事情 My code StreamReader sr new Stream
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • 通过网络共享的 SQL CE

    我之前见过这个问题 但找不到关于什么是可能 不可能以及什么解决方法可能可用的明确解释 我有一个现有的 C 应用程序 它使用 SQL CE 来存储本地信息 该数据库只能由单个应用程序访问 并存储在用户的 appdata 文件夹中 某些环境将

随机推荐

  • UIViewController 通话中状态栏问题

    Issue 通话状态栏消失后 模态呈现的视图控制器不会向上移动 在顶部留下 20px 的空白 透明空间 正常 没有问题 通话中 没有问题 通话中消失后 在顶部留下 20 像素高的空白 透明空间 显示下面的橙色视图 但是状态栏仍然存在于透明区
  • “您确定要离开此页面吗?”取消和确定功能

    我正在尝试执行类似于您离开的某些网站的操作 它会显示一个弹出窗口 显示 您确定要离开此页面吗 并有两个选项 取消 和 确定 我该如何做到这一点 并做到当您单击 取消 时 它只会取消该框 当他们单击 确定 时 它会执行 leaveChat 功
  • 如何仅在非整数时显示小数点?

    我用谷歌搜索过 但找不到正确的答案 假设我们有浮点数并得到它们的平均值 他们的平均值是这样的 3 5 2 5 5 7 所以我们有 4 个数字 不再在列表中的人 两个带小数的数字和两个整数 我想做的是 打印这些数字并保持这样 但我的问题是 当
  • JQuery ajax调用默认超时值

    我收到了无法复制的错误报告 但 ajax 调用超时是当前最好的猜测 所以我试图找出 jQuery 超时的默认值 ajax 称呼 有人有主意吗 在 jQuery 文档中找不到它 似乎没有标准化的默认值 我感觉默认是0 超时事件完全取决于浏览器
  • 使用 Javascript 将日期设置为 raddatepicker

    我从服务器端获取日期值并将其传递给 javascript 方法 然后使用 Javascript 将日期分配给 Telerik RadDatePicker 控件 我得到的日期为 var Date1 16 01 2013 00 00 00 fu
  • 更广泛的递归/泛型问题

    根据提出的问题和回答的问题here https stackoverflow com questions 6650532 recursive java generics between two classes 我有第二个 更复杂的一个 至少在
  • 如何过滤wireshark以仅查看从我的计算机发送/接收的dns查询?

    我是wireshark新手 正在尝试编写简单的查询 要查看仅从我的计算机发送或由我的计算机接收的 DNS 查询 我尝试了以下操作 dns and ip addr 159 25 78 7 其中 159 25 78 7 是我的 IP 地址 看起
  • IE11 中图标字体未加载

    我们使用 icomoon 作为图标字体 它们在 Chrome 和 Firefox 中运行良好 但在 IE11 中无法显示 有时 它似乎适用于第一个页面加载 但不适用于后续页面加载 清除缓存似乎不会重置它 其他IE版本也可能存在此问题 目前我
  • Android视频删除色度键背景

    我检查过this https stackoverflow com questions 12813089 i am working on android camera app i want to capture image and chang
  • Java 和 C/C++ 之间进程间通信的最快(低延迟)方法

    我有一个Java应用程序 通过TCP套接字连接到用C C 开发的 服务器 应用程序和服务器都在同一台机器 Solaris 机器 上运行 但我们最终正在考虑迁移到 Linux 交换的数据类型是简单消息 登录 登录ACK 然后客户端请求某些内容
  • 警告 - Perl 中的“哈希分配中的元素数量为奇数”

    我使用以下语法收到警告 my data variables Sno gt 5 0 ID gt 20 1 DBA gt 50 2 Address gt 80 3 Certificate gt 170 4 但在使用类似的语法时我没有收到类似的警
  • 将csv文件读取到“DataFrame”时如何指定索引的“dtype”?

    在 python 3 4 3 和 Pandas 0 16 中 如何指定dtype索引为str 以下代码是我尝试过的 In 1 from io import StringIO In 2 import pandas as pd In 3 imp
  • 设置 ItemIsMovable 标志时,子项在 QGraphicsView 中不可移动

    要调整项目中的项目QGraphicsView http qt project org doc qt 5 0 qtwidgets qgraphicsview html 我将表示顶点的子项放到要移动的项上 使用构造函数中建立的父子关系 就是下图
  • Ant JUnit ClassNotFoundException

    我意识到有很多类似的问题this one https stackoverflow com questions 10658636 new to ant classnotfoundexception with junit 但是在阅读了其中的大多
  • 键盘覆盖了 webapp 中的文本输入(iOS)

    我正在开发一个网络应用程序 屏幕下半部分有两个输入字段 父视图绝对定位于屏幕 通常 人们会假设单击输入字段时 焦点会强制输入进入键盘上方的视图 但是 键盘覆盖了输入字段 如果我开始打字 则该字段中不会输入任何内容 为了在字段中输入内容 我必
  • 匿名子类化 TimerTask 的正确方法是在 run 方法中保留对“this”的引用

    我子类化了TimerTask使用匿名 具体 类 这样 public void setTimedTask Note this implements an interface called UpdateIndicatorsReceiver fi
  • localStorage,使用toggleClass保存类

    我似乎对本地存储一无所知 我想通过切换类来设置一种最喜欢一组 div 中的任何 div 的方式 我可以让toggleClass在单个div上工作并保存 但localStorage将所有div保存为收藏夹 而不仅仅是设置了toggleClas
  • 选择子子项中的最新记录

    我有以下表格 列 Parent ParentID Child ChildID ParentID SubChild SubChildID ChildID Date Parent与 具有一对多关系Child Child与 具有一对多关系SubC
  • 在 ReactJS 环境中设置复选框样式

    我正在尝试设计一个复选框的样式ReactJSIE11 的环境 但似乎没有取得太大成功 有人可以建议吗 代码如下 CSS squared input type checkbox border radius 4px background ff0
  • 当鼠标位于 Qt 窗口的自定义小部件上时,如何移动整个窗口?

    假设我有一个自定义小部件并将其添加到 qt 的主窗口中 如您所见 红色区域是自定义小部件 我想要做的是 当鼠标在红色区域按下并移动时 整个窗口也会移动 我知道如何简单地实施mousePressEvent and mouseMoveEvent