Qt 我可以在构造函数中将信号/槽连接到自身吗?

2024-03-09

编辑:与信号/插槽/连接无关。问题是构造函数调用构造函数。

可能有更好的方法来做到这一点 - 我有兴趣听到这些......

我有从 QLabel 派生的 MyClass。我想在信号中传递更多有关派生类的数据,而不是基本信号的数据。因此,我创建了一个插槽来拦截 customContextMenuRequested 信号并发出具有更多数据的修订信号。

当我尝试在构造函数中连接此信号时,我的插槽永远不会被调用。但是,如果我移动策略并将线路连接到父小部件(不是类层次结构父级),以便它们在 MyClass 完全构造后执行,那么我的插槽将被调用。但我总是希望将其连接到这个类,这似乎是我想要在它的构造函数中实现的东西,而不是指望父类记住这样做。

我做错了什么吗?或者向信号添加数据的更好方法?

MyClass::MyClass() : QLabel()
{
    QFont currFont = font();
    currFont.setPointSize(15);
    setFont(currFont);

    setBackgroundRole(QPalette::Mid);

    std::cout << "connecting customContextMenuRequested" << std::endl;
    /** PROBLEM START */
    setContextMenuPolicy(Qt::CustomContextMenu);

    // Is there anything wrong with connecting from "this" to "this" in a constructor?

    QObject::connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
                     this, SLOT(addCellDataToMenuContextRequest(const QPoint&)));
     /* PROBLEM END **/
}


MyClass::MyClass(QString &cellString, int row, int col)
    : QLabel(cellString)
{
    MyClass();
    setRow(row);
    setCol(col);

}

// This one is a slot
void MyClass::addCellDataToMenuContextRequest(const QPoint& pos)
{
        // This doesn't get printed if I connect in my constructor,
        // but it does print if I do the same connect from a parent widget.
    std::cout << "called addCellDataToMenuContextRequest" << std::endl;

    emit customContextMenuRequestedForCell(pos, _row, _col);
}

因此,我希望父小部件只查找 customContextMenuRequested ForCell,但现在,父小部件似乎也需要负责 customContextMenuRequested。


实际上,如果您使用 C++11,您可以调用(某种程度上)另一个构造函数。它被称为委托构造函数 http://en.wikipedia.org/wiki/C++11#Object_construction_improvement。但我不认为这会让问题消失。您的问题似乎是元对象在以下情况下未完全构造connect()叫做。此外,您可能需要迁移到 Qt 5 才能使 C++11 工作。

解决方案是延迟连接,直到对象完全构造完成。你可以启动计时器 http://qt-project.org/doc/qt-4.8/qobject.html#startTimer间隔为零。它将在下一个事件循环处理时触发,这肯定是在您的对象完全构造之后。

然后在您的计时器事件中建立连接并终止计时器。

EDIT:没有看到您的编辑。看起来你找到了解决方案。那就忽略这个吧。 :)

顺便提一句。您没有调用另一个构造函数。您创建了一个临时 MyClass 对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 我可以在构造函数中将信号/槽连接到自身吗? 的相关文章

随机推荐

  • Bash 'for' 循环语法?

    Bash 的语法是什么for loop 我努力了 for i 0 i lt 10 i do echo i done 我收到此错误 line 1 0 syntax error operand expected error token is 0
  • 在 npm install socket.io 期间,出现错误 127,未找到 node-waf 命令。怎么解决呢?

    我正在尝试使用node js 包管理器在centos 5 上安装socket io 在安装过程中我遇到了一个错误 make node waf 找不到命令 and 这很可能是 ws 包的问题 npm install socket io npm
  • 如何在 Laravel 集成测试中等待页面重新加载

    我们有一个操作来编辑重定向到同一页面的用户配置文件 这里 seePageIs 似乎没有等待新页面加载 以下测试失败 因为在响应中找不到新用户名 当我们在测试后手动加载个人资料页面时 它已正确更新 public function testCa
  • 此反应库代码周围的“{”“}”大括号有何意义? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在查看反应库代码 经过我发现一段特殊的代码我无法理解它的意义 有人可以帮忙吗 var validateFormat funct
  • jQuery datepicker 导致页面溢出

    我正在使用 jQuery ui 1 8 中的 datepicker 控件 from date是文本输入 我附上一个非常简单的日期选择器 from date datepicker 这会导致页面溢出 垂直滚动条 我试图避免这种情况 一旦我单击起
  • 无法解析类型“uint32_t”

    我正在 Eclipse 3 8 1 CDT 中开发 C 程序 我在 Debian 8 上使用 gcc 编译器 我还使用一个用 C 编写的名为 opendnp3 的开源库 它需要uint32 t来解析 因为它是多个方法调用和构造函数中的参数
  • 在执行过程中停止 Rhino 引擎

    Rhino 引擎是否有一个 api 可以停止执行 脚本fie在中间 例如 我有一个脚本文件 其中 有一个无限循环 怎样才能中途停止执行呢 当然 我可以停止启动Rhino引擎的jvm 执行脚本 但我不想因为这个原因终止整个 jvm 会话 因为
  • Javascript 排序以匹配 SQL Server 排序

    任何人都可以向我指出 JavaScript 中的排序算法 该算法的排序方式与 SQL Server 的排序方式相同 对于 nvarchar unicode 列 作为参考 我之前关于此行为的问题可以在这里找到 SQL Server 2008
  • 像 RStudio 这样的 Python 工作流程?

    我使用 Python 作为主要编程语言 有时会切换到 R 来执行快速数据分析任务 因为它具有用于统计编程目的的庞大库 尽管pandas http pandas pydata org 对于 python 来说太棒了 我猜大多数 R 用户都会选
  • 无法在 Android 模拟器中模拟位置数据

    我正在尝试测试我的应用程序 它使用模拟器使用地理定位 介绍了几种方法here https stackoverflow com questions 2279647 how to emulate gps location in the andr
  • 如何在数字数组中找到最佳匹配元素?

    我需要帮助解决一些看似简单但让我困惑的事情 尝试编写一些模糊匹配方法来处理根据需要计算的值与选择列表中实际可用的值之间的格式差异 价值 期权执行价格 始终是计算出的 Float 例如85 0 or Int 该数组包含字符串形式的数字 无论是
  • Jackson deearlization:根上有两个键。我如何打开其中一个并忽略另一个?

    使用杰克逊 2 x json 响应如下所示 flag true important id 123 email email protected cdn cgi l email protection flag 键不提供任何有用的信息 我想忽略
  • 为什么 C++ 编译器在创建机器代码之前将源代码翻译成汇编? [复制]

    这个问题在这里已经有答案了 我开始学习C 了解到编译器通过编译将源代码从程序变成机器代码 然而 我了解到 C 编译器实际上将源代码转换为汇编代码 作为将汇编代码转换为机器代码之前的中间步骤 这一步的目的是什么 他们为什么不直接将其翻译成机器
  • Reactjs/Apollo/AppSync 突变触发两次

    我遇到了 React Apollo AppSync 的问题 突变触发了两次 或多次 我有一个 React 应用程序 它有一个由通常的 UI 按钮 onClick 触发的更新突变
  • VS2012 发布网站 dll 而不是 cs 文件

    我有一个想要发布的简单 ASP NET 项目 我右键单击该项目并按 发布网站 但这会将我的所有 cs 文件生成到所选文件夹中 之前我一直在 bin 文件夹中获取 dll 文件而不是 cs 文件 我究竟做错了什么 问题可能出在发布设置中 请检
  • Javascript:检测 OS X“自然滚动”设置

    我面临一个问题 对于我正在做的项目 我正在检测滚轮位置 并根据该位置是否导航到下一张幻灯片 然而 一个问题是 一些 Mac 用户使用 自然滚动 反转页面上的滚动 这意味着 对于这些用户 我应该使用另一个方向的滚动作为触发器 我的问题是 有没
  • 在 VB.NET 中将 ArrayList 数据绑定到 ListBox?

    我在 VB NET 工作 我有一个名为 Invoices 的 ArrayList 其中填充了 Invoice 类的对象 我想将其数据绑定到 ListBox 以便随着 ArrayList 的内容更新并更改 ListBox 的更新 我已经在 I
  • 如何使用shell脚本访问mysql数据库?

    有没有办法使用 shell 脚本访问 MySQL 数据库 想要对多个表进行一些选择和插入 如果您能提供一些示例代码 那就太好了 因为我是脚本编写新手 这个链接似乎有你想要的信息 http www cyberciti biz faq usin
  • Android SQLite 中的多线程怎么样?

    在我的应用程序中 我必须实现一些 UI 和同步服务 它在后台运行并更新数据 同步服务并不是很简单 它使用了多线程 所以 这是我的故事 当我开始开发这个应用程序时 我对sqlite一无所知 所以我只是没有在Java中使用任何线程同步 结果 我
  • Qt 我可以在构造函数中将信号/槽连接到自身吗?

    编辑 与信号 插槽 连接无关 问题是构造函数调用构造函数 可能有更好的方法来做到这一点 我有兴趣听到这些 我有从 QLabel 派生的 MyClass 我想在信号中传递更多有关派生类的数据 而不是基本信号的数据 因此 我创建了一个插槽来拦截