首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在使用exec或open打开QDialog后,mousePressEvent to QGraphicsItem会出现错误?

在使用exec或open打开QDialog后,mousePressEvent to QGraphicsItem会出现错误的原因是,exec和open方法会阻塞当前线程,导致QGraphicsItem无法接收到鼠标事件。

QDialog是Qt中的对话框类,而QGraphicsItem是用于在Qt中创建图形项的基类。当使用exec或open方法打开一个对话框时,会创建一个新的事件循环,并阻塞当前线程,直到对话框关闭。

在这种情况下,鼠标事件会被发送到对话框上,而不是发送到QGraphicsItem上。因此,QGraphicsItem无法接收到鼠标事件,导致出现错误。

解决这个问题的方法是,可以通过重写对话框的鼠标事件处理函数,将鼠标事件传递给QGraphicsItem。具体步骤如下:

  1. 在对话框类中重写鼠标事件处理函数mousePressEvent(QMouseEvent *event)。
  2. 在重写的函数中,获取鼠标事件的坐标,并将其转换为场景坐标。
  3. 使用QGraphicsView的mapToScene函数将场景坐标转换为图形项坐标。
  4. 调用QGraphicsItem的mousePressEvent函数,并传递转换后的坐标作为参数。

以下是示例代码:

代码语言:txt
复制
class MyDialog : public QDialog
{
    // ...

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        // 获取鼠标事件的坐标
        QPoint pos = event->pos();

        // 将坐标转换为场景坐标
        QPointF scenePos = mapToScene(pos);

        // 将场景坐标转换为图形项坐标
        QPointF itemPos = graphicsView->mapFromScene(scenePos);

        // 调用QGraphicsItem的mousePressEvent函数
        QGraphicsItem *item = graphicsView->itemAt(itemPos);
        if (item)
        {
            item->mousePressEvent(event);
        }
    }

    // ...
};

请注意,上述示例代码中的graphicsView是一个指向QGraphicsView的指针,需要根据实际情况进行修改。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PyQt5 图形项的定义和交互(一)

,又或者需要对项进行动画处理,使用PyQt的图形视图类(QGraphicsView)比重新实现一个窗口部件的绘制事件更方便一些。 要使用图形视图类就必须创建一个场景(QGraphicsScene)。...场景可以有一个前景层,例如可以为场景中每个项绘制网格;场景也可以有一个背景层,可提供一个背景图像背景色。 项既可以是场景的一些子项,也可以是其它项的子项。...当对一个项应用视图变换时,这些变换递归地自动应用于该项的所有子项上去。 视图使用的是物理坐标系(viewport),场景使用的是逻辑坐标系(window),这个坐标系是创建场景时选择的。...在对项进行定位时,是使用逻辑坐标系的方式来放置它们。第三种坐标系是项所使用的坐标系,它的零点位于项的中心,也就是该项在场景中的位置。...下面的例子使用了三种图形项,文本图形项,普通图形项(边框)和像素图图形项。可以对它们进行独立的交互,可以将场景打印出来,还可以将 场景保存到一个自定义的文件以供后续打开。 ?

1.8K40

qdialog 返回值_QDialog 窗口级别模态(续)「建议收藏」

那么,为什么不提供一个类似的函数,只需简单的调用一下就可以实现一个窗口级别的模态对话框呢?答案就是QDialog::open()。QDialog::open()可以打开一个窗口级别模态对话框。...好在QDialog提供了finished()信号,该信号正确设置对话框的返回值,类似accept()和reject()。当然,你也可以直接继承QDialog从而使用自己的 signal。...现在,我们有了一个更加完善的映射关系: QDialog::show()=>Qt::NonModal QDialog::exec()=>Qt::ApplicationModal QDialog::open...这也许让一些使用QFileDialog的用户感到困惑,因为 Mac OS X 下,Qt 的QFileDialog的确是一个 sheet。...使用QColorDialog::NoButtons以避免 OK 和 Cancel 按钮出现

1.7K31

基于Qt的流程设计器(一)

一:先来看一下界面的截图: 说明: 拖动节点的时候,与该节点相关的箭头连线也跟着调整; 用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标空白区域点击一下,拖出的箭头消失) 这三个图标,手型图标处于选中状态的时候...,节点可以拖动, 箭头图标处于选中状态的时候,可以使用鼠标绘制连线箭头 最后一个图标,用于画布上创建一个节点方框 二: 关键代码文件如下图(用红框框住的为关键代码文件) 其他文件均为辅助代码文件(有些文件中的代码没有用到...是QGraphicsItem的虚函数,必须要实现, 其中1.5是箭头连线的线宽,8是箭头张开所占的区域宽度 p1是箭头的起始点,p2是箭头结束点(也就是带箭头的那一端) 最终返回的一个Rect结构如下图所示...与这个节点相关的箭头都要跟着移动 Arrows就是与当前方框节点有关的箭头 八: 来看一下CustomRect的MousePressEvent的代码 在这个代码中, 我们先为全局标志ScenClickFlag...,并在起始节点和结束节点分别记录了箭头的指针 以后这两个节点移动的时候,箭头也跟着移动了。

1.5K60

【QT】QT事件处理

实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。...每个程序的main函数最后都会调用QApplication类的exec()函数,它会使QT应用程序进入到事件循环,使应用程序在运行的时候接收各种事件。...一旦有事件发生,QT便会构造一个相应的QEvent子类的对象来表示它,然后将它传递给QObject对象子对象。 ---- 鼠标事件 对鼠标实现进行重写来实现你想要达到的功能。...fill(Qt::white); QPainter painter(this); QPen pen(Qt::DotLine); //按照步长画纵向网格线 //bagin与end成对出现...m_startY:m_startY+m_step; } } drawPix();//根据调整的图标位置重新m_pix上绘制图像 update();//触发窗口重绘 }

1.5K10

Qt5-QtWidgets篇

in editor 编辑资源 添加前缀 添加文件 使用 “: + 前缀名 + 文件名” 小总结 + 只能有一个的是set 可以允许多个是add 对话框 模态对话框 不可以对其他窗口进行操作 QDialog...dlg(this); dlg.exec(); 消息对话框 错误对话框 QMessageBox::critical(this,”critical”,”错误”); 信息对话框 information 提问对话框...setTextAlignment(Qt::AlignCenter); //居中 ui窗口自布局 Spacers 弹簧 Widget div盒子 Group Box 分组[适用于Radio Button] 主窗口设置垂直布局可以...事件分发器 bool event(QEvent * ev) 返回值是bool类型,如果返回true,代表用户要处理这个事件,不向下分发事件了[类似于钩子] 事件枚举QEvent ev.type(); 拦截使用子类的操作可以使用静态类型转换...p=63&spm_id_from=pageDriver] HM NIS Edit 和 NSIS 案例:翻金币 收获 删除资源文件需要删除debug文件,不然会报错 界面的切换可以使用信号和槽 即其它界面

1.4K20

Qt Designer基本控件介绍——Display Widgets(显示小部件)

text():获得Qlabel的文本内容 setText():设置Qlabel的文本内容 selectedText():返回所选择的字符 信号: linkActiveted:当单击标签中的超链接,希望新窗口打开这个超链接时...__init__() # 使用super函数可以实现子类使用父类的方法 self.setWindowTitle("记事本") self.setWindowIcon(QIcon...View : 用于显示QGraphicsScene场景的部件,可用来显示图片 QGraphicsView框架主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem...默认情况不使用缓存模式。 cacheMode(): 返回缓存模式。...1 self.progressbar_obj1.setValue(self.step) def on_button_clicked(self): # 按钮被单击的处理函数

7.6K20

PySide6 GUI 编程(1): 环境准备与示例代码

__version__) 运行得到输出:6.7.0 PyCharm上配置Designer等工具 进入pip show pyside6展示的安装路径: 在此路径有有三个 .app 目录: Assistant.app...大多数Qt应用程序都会直接间接地使用QWidget的派生类。 特点:QWidget可以包含其他控件(如按钮、文本框等),并且可以作为其他窗口的子部件。...QDialog 定义:QDialog 也是 QWidget 的一个子类,用于创建对话框。 用途:QDialog 用于需要用户输入反馈的交互式窗口,如登录框、设置窗口消息提示框。...特点:QDialog 提供了对话框特有的功能,如默认按钮、取消按钮和帮助按钮。它还可以阻止用户在对话框打开时与应用程序的其他部分交互,除非对话框被关闭。...组合使用Qt应用程序中,通常首先创建一个 QMainWindow 作为主窗口,然后在其中嵌入弹出 QDialog 对话框,以处理用户交互。

20732

QT从控件部分知识点整理

setCentralWidget(edit); ---- 资源文件添加 步骤1: 找到当前项目所在文件夹,将对应的资源放入当前项目所在的文件夹 步骤2: 选择QRF: 点击Open...dlg.resize(200,100); dlg.exec(); qDebug()<<"模态对话框弹出了"; //非模态对话框(打开了该对话框之后...,可以对其他窗口进行操作) //QDialog dlg2(this); 这里放在匿名函数对象,生命周期只有一行,对话框一闪而过,建议堆区创建 QDialog* dlg2...=new QDialog(this);//重复点击关闭窗口,重复再堆区创建对象,导致内存泄露 dlg2->resize(200,100); dlg2->show();...: //消息对话框 //错误对话框---弹出一个警告窗口 QMessageBox::critical(this,"警告","用户名错误");//父亲 标题 内容

1.1K20

Qt官方示例解析-Address Book-基于单个数据模型不同视图呈现不同数据

这是通过同一个模型上使用多个视图实现的,每个视图都使用QSortFilterProxyModel类的一个实例进行过滤。...() == QDialog::Accepted) { sendDetails(oDialog.name(), oDialog.address()); } } 啊,这里又出现了一个...void AddressWidget::showAddEntryDialog() { AddDialog oDialog; if (oDialog.exec() == QDialog::...联系人列表的内容使用QDataStream写入文件。如果文件无法打开,则会显示一个QMessageBox,并显示相关的错误消息。...两个编辑条目Edit Entry和Remove Entry操作默认情况下是禁用的,因为这样的操作不能在一个空的地址簿上执行。只有添加一个多个联系人时才启用它们。

5.2K20

Pycharm+PyQt5配置GUI开发环境

目录 Qt Creator配置Qt Designer命令配置Qt Designer-Current命令配置PyUIC命令配置PyRcc5命令为什么使用资源文件?...当然Windows系统里,可以通过pip install pyqt5-tools安装就可以使用qtdesigner.exe了。 配置Qt Designer命令 ?...上面已经添加了Qt Designer命令为什么还要这个命令呢?一个是打开Qt Designer软件,一个是用Qt Designer软件打开当前选中文件。根据自己需求添加吧。 配置PyUIC命令 ?...命令:pyrcc5 -o xxx.qrc xxx.py 为什么使用资源文件? 我们使用PyQt5设置控件图片等资源时,一般可以直接使用相对路径进行加载。 直接使用代码中进行加载。...使用PyInstaller打包PyQt5文件,因为无法识别Qt动态文件路径,导致程序打开失败。

2.9K20

Qt入门系列(二)

文章首发在博主知乎 ---- 作业1 需求:点击按钮打开,弹出一个新的菜单,单击按钮关闭,关闭新开的菜单 步骤: 1.新建一个QMainWindow项目 2.1的基础上新建一个类QMainWIndow2...Q.h中添加Q2对象和定义函数 //实例化对象 private: QPushButton *btn1=new QPushButton("打开",this); QPushButton...中显示->粘贴进来(显示包含的目录) 2.Q1_Resource最上面右键->添加新文件->Qt->qt resource file->设置名字->生成res.qrc 3.离开res.qrc无法重新返回...,此时右键res.qrc->open in editor->添加前缀->添加文件(全选1中的图片打开,此时全部加载进去)->点击编译 4.编辑代码 //使用添加资源文件 “: + 前缀名 +文件名.../非模态,创建 QDialog dlg2(this);//栈上自动销毁 dlg2.show(); QDialog *dlg3=new QDialog(this

1.8K30

Qt多线程创建

这对于开发图形界面程序尤其重要,当一个操作耗时很长时(比如大批量I/O大量矩阵变换等CPU密集操作),整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长的操作置于一个新的线程...run()是个纯虚函数,是线程执行的入口,run()里出现的代码将会在另外线程中被执行。run()函数是通过start()函数来实现调用的。...线程因为调用printf()而持有一个控制I/O的锁,多个线程同时调用printf()某些情况下回造成控制台输出阻塞,而用qDebug()作为控制台输出一般不会出现上述问题。...否则点击Quit按钮叉号退出窗口,进程依然驻留在系统里。...(); return app.exec(); } 注: GUI程序中,主线程也被称为GUI线程,因为它是唯一一个允许执行GUI相关操作的线程。

1.2K51

Python Qt GUI设计:5种事件处理机制(提升篇—3)

2.1、重新实现事件函数 比如mousePressEvent()、keyPressEvent()、paintEvent()。这是最常规的事件处理方法。...绘制事件是代码的核心事件,它的主要作用是时刻跟踪text与message这两个变量的信息,并把 text的内容绘制到窗口的中部,把message的内容绘制到窗口的底部(保持5秒就会被清空)。...例如,对于绘图事件,event交给paintEvent函数处理;对于鼠标移动事件,event交给mouseMoveEvent函数处理;对于键盘按下事件,event交给keyPressEvent函数处理...通过示例,了解事件过滤器的使用方法,效果如下所示: 对于使用事件过滤器,关键是要做好两步。...(),在实践中,调试时才会使用这种方法,实际中基本用不多,这里不再赘述了。

2.1K30
领券