【问题标题】:Qt slot with default argument带默认参数的 Qt 插槽
【发布时间】:2012-02-22 22:04:46
【问题描述】:

我有一个旋转控件块,可以更改数组的各个元素 我不想拥有单独的接收器插槽函数,而是只想指定哪个控件在信号中发送消息

您可以使用 QSignalMapper 来做到这一点 - 但有没有像下面这样简单地做到这一点?

spin0 = new QDoubleSpinBox;
connect(spin0,SIGNAL(valueChanged(double)),this,SLOT(handler(0,double));

spin1 = new QDoubleSpinBox;
connect(spin1,SIGNAL(valueChanged(double)),this,SLOT(handler(1,double));
....

private slot:
void handler(int element,double value);

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

    您可以从任何插槽处理程序中使用sender() 获取指向发送信号的对象的指针。然后您可以使用objectName() 属性来传达任何进一步的识别信息。

    【讨论】:

    • 但是接收器功能需要知道gui的很多细节 - 即。可以访问所有的 spincontrol 对象
    • 我不确定我是否关注你。如果您将每个旋转控件上的对象名称设置为“0”、“1”等,那么在您的处理程序中,您可以使用sender()->objectName().toInt() 来实现您在上面所说的内容。处理程序只需要知道QObject 发送的信号就可以了。澄清一下,sender() 是handler() 所在对象的函数。无需了解所有的旋转控件。
    • 可以使用对象名称,是的,这是一个很好的解决方案。我正在考虑将 sender() 与将 gui 与处理程序耦合得过于紧密的 spin0 ptr 进行比较!
    • 啊,是的,这将是一个紧密的耦合:)
    【解决方案2】:

    我不这么认为,至少不使用那种语法...SIGNAL 和 SLOT 宏将它们的参数转换为字符串,然后由 Qt 运行时解析和使用以查找相关函数和/或在编译的预处理阶段由moc 创建的表中的类方法。因此,如果您将默认参数编码到 SLOT 宏中,那么这不是 Qt 可用于在运行时查找 moc 生成的函数表中的实际槽函数的有效函数签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2020-05-16
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多