【问题标题】:QSpinBox and QDoubleSpinBox do not call method on valueChangedQSpinBox 和 QDoubleSpinBox 不在 valueChanged 上调用方法
【发布时间】:2019-09-02 14:51:40
【问题描述】:

我要做的就是在 qspinbox 和 doublespinbox 的值发生变化时调用一个方法。

我不需要更改旋转框中的实际值,我只希望它触发另一个方法的调用。为什么下面的代码没有错误或根本没有做任何事情?连方法都不调用?

cpp

connect(uiSpinBox, SIGNAL(valueChanged()), this, SLOT(slotInputChanged));
connect(uiDoubleSpinBox, SIGNAL(valueChanged()), this, SLOT(slotInputChanged));

void ColorSwatchEdit::slotInputChanged()
{
    qDebug() << "Im here";
}

标题

public:
    QSpinBox *uiSpinBox;
    QDoubleSpinBox *uiDoubleSpinBox;

public slots:
    void slotInputChanged();

【问题讨论】:

  • 信号为SIGNAL(valueChanged(double))
  • 我试图从两个不同的 spinbox 中调用方法 slotInputChanged,一个是 Int spinner,另一个是 double。
  • @JokerMartini 使用connect(uiSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slotInputChanged)); connect(uiDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotInputChanged));
  • 为什么人们用答案来制作 cmets....请回答问题的实际答案,以便我可以标记它
  • 不是一个答案而是一个提示:连接的风格是在运行时解析连接的旧风格。您可以调查 Qt5 附带的New Signal Slot Syntax。它允许在编译时检测断开的连接。

标签: c++ qt qt-signals qt-slot


【解决方案1】:

即使你不使用携带信号的数据,你也必须在连接中建立签名:

connect(uiSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slotInputChanged)); 
connect(uiDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotInputChanged));

但建议您使用新的连接语法,因为它会指示错误:

connect(uiSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &ColorSwatchEdit::slotInputChanged); 
connect(uiDoubleSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &ColorSwatchEdit::slotInputChanged);

【讨论】:

  • @CharonX 很明显,在 Qt5 中应该首选新的连​​接语法。
  • @Scheff 实际上,重载可能会在将来导致错误,但在这种情况下,产生错误的是未使用签名。
  • @Scheff 我使用这两种语法取决于它是 Qt4 还是 Qt5,因为尽管 Qt5 已经运行了 5 年多,但仍有项目使用 Qt4 维护。
  • @eyllanesc 是的。我有点专门使用新样式,如果有一些 qWarning 类似于“与 Bla 的连接不起作用,因为有匹配的信号/SLOT”,那么让编译器抱怨比必须观看外流要好得多:)跨度>
【解决方案2】:

除了 eyllanesc 的 答案之外,如果可能,请考虑使用 FunctionPointer 语法,即

connect(uiSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &YourClass::slotInputChanged)

connect(uiDoubleSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &YourClass::slotInputChanged)

这样编译器可以在编译时告诉你连接是否无法解析

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2020-12-13
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多