首页 > 其他分享 >Warning: QDialog::exec: Recursive call detected

Warning: QDialog::exec: Recursive call detected

时间:2024-03-09 17:47:17浏览次数:25  
标签:调用 Recursive 对话框 exec detected QDialog 线程

 

查看QDialog::exec的源码

int QDialog::exec()
{
    Q_D(QDialog);

    if (d->eventLoop) {
        qWarning("QDialog::exec: Recursive call detected");
        return -1;
    }

    bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose);
    setAttribute(Qt::WA_DeleteOnClose, false);

    d->resetModalitySetByOpen();

    bool wasShowModal = testAttribute(Qt::WA_ShowModal);
    setAttribute(Qt::WA_ShowModal, true);
    setResult(0);
...

 

原因:QDialog的exec被递归调用,什么是递归调用?在上一次exec调用尚未返回又调用了一次exec

 

导致该错误的一种情况是多线程,UI线程exec对话框,某线程隐藏对话框,并在UI线程的exec返回之前又exec该对话框

另一种情况是UI线程的信号槽,在槽函数中结束对话框接着立马又exec一次对话框,因为同一线程的信号槽本身就是同步调用的(即信号发出的下一刻就会调用槽)。我的错误就是这个原因,实际场景如下:

1、主界面通过button启动了工作线程A,并弹出模态对话框阻塞用户操作;

2、等待线程A完成,主界面通过槽函数on_A接收线程A的完成信号

3、on_A内部,先关闭对话框,然后又启动了工作线程B,并exec同一个对话框阻塞用户操作;

4、等待线程B完成,主界面通过槽函数on_B接收线程B的完成信号

5、on_B内部,关闭对话框

在步骤3中,exec对话框没反应,对话框并没有弹出来,排除警告 QDialog::exec: Recursive call detected

上述过程的调用堆栈如下:

第一次exec调用

关闭第一次的对话框

第二次exec调用

 Warning: QDialog::exec: Recursive call detected

第二次exec返回

关闭第二次的对话框

第一次exec返回

 

解决办法:

创建两个对话框即可,不同对话框的事件循环不同,互不干扰

 

标签:调用,Recursive,对话框,exec,detected,QDialog,线程
From: https://www.cnblogs.com/coder-kelvin-yan/p/18063028

相关文章

  • Executed_Gtid_Set有多个值
    搭建MySQL主从时发现个问题,问题描述:主库:192.168.161.131从库:192.168.161.132在从库执行showslavestatus\G结果如下:root@localhost:(none)10:31:26>showslavestatus\G***************************1.row***************************Slave_IO_State:W......
  • ExecuteSqlRaw
    ExecuteSqlRaw是EntityFrameworkCore提供的方法之一,用于执行原生的SQL查询或命令,并将结果返回给应用程序。该方法允许您执行任意的SQL查询或命令,而不受EFCore查询构造器的限制。以下是ExecuteSqlRaw方法的基本用法:_context.Database.ExecuteSqlRaw("SQLQueryor......
  • ExecuteSqlInterpolated
    ExecuteSqlInterpolated是EntityFrameworkCore提供的方法之一,用于执行原生的SQL查询或命令,并将结果返回给应用程序。与ExecuteSqlRaw方法类似,但ExecuteSqlInterpolated允许您使用插值字符串来构建SQL查询或命令,而不是使用字符串插值。以下是ExecuteSqlInterpolated......
  • pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine
    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07File"/home/devil/anaconda3/envs/sample-factory/lib/python3.11/site-packages/torch/_tensor.py",line522,inbackwardtorch.autograd.backward(File"/home/devil/anaconda3/envs/sample-......
  • Linux下system()与execl()的区别,popen()
    System与exec的区别1、system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程2、system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程 popen()system()函数用起......
  • Hudi-FlinkSQL导入数据报错:[ERROR] Could not execute SQL statement. Reason: java.l
    问题描述通过FlinkSQL创建Hudi表后,向表中插入数据报错:[ERROR]CouldnotexecuteSQLstatement.Reason:java.lang.ClassNotFoundException:org.apache.hadoop.fs.FSDataInputStream 解决办法向Hudi表中写入数据时,会调用Hadoop的Jar包,但是Flink的lib目录中没有该Jar包。......
  • Angr Execution Pipeline
    ReferenceUnderstandingtheExecutionPipelineIfyou’vemadeitthisfaryouknowthatatitscore,angrisahighlyflexibleandintenselyinstrumentableemulator.Inordertogetthemostmileageoutofit,you’llwanttoknowwhathappensateveryste......
  • 关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别
    findgoal.log.*.gz-mtime+2-execrm-rf{}\;findgoal.log.*.gz-mtime+3|xargsrm-f前言:find命令一直都是系统管理员的常用命令之一,其参数中“-exec”尤其实用。而“xargs”命令,针对查询也有属于自己的见解。本文着重讲解的是围绕find命令查询为主线,使用-exe......
  • 导出execl
    //导出letexportToExcel=async()=>{//创建一个新的工作簿constworkbook=newExcelJS.Workbook();constworksheet=workbook.addWorksheet("Sheet1");//在工作表中添加数据constdata=carStatNum.value;//添加列的数据类型定义worksheet......
  • Windows ® Installer. V 5.0.20348.1668 (msiexec命令 参数
    Windows®Installer.V5.0.20348.1668msiexec/Option<RequiredParameter>[OptionalParameter]安装选项 </package|/i><Product.msi> 安装或配置产品 /a<Product.msi> 管理安装-在网络上安装产品 /j<u|m><Product.msi>[/t<TransformList>......