1

我创建了一个用于处理从插槽接收的数据的类,并创建了几个具有不同参数类型的同名重载方法。

是否可以将重载方法用作插槽?

到目前为止,我有两个声明:

    void notify(uint uintData);
    void notify(float fltData);

然而,第二个在运行时产生警告:

    QObject::connect: No such slot clsSlot::notify(float)

发现这意味着它应该可以工作:http ://doc.qt.io/qt-5/signalsandslots.html

但它不...

从“clsSlot”类:

    public slots:
        void notify(uint uintValue);
        void notify(float fltValue);

执行:

    void clsSlot::notify(float fltValue) {
        notifyPrimitive(meID, QString::number(fltValue));
    }
    void clsSlot::notify(uint uintValue) {
        notifyPrimitive(meID, QString::number(uinValue));
    }

连接呼叫:

        QObject::connect(Fcs::Mount::GetRef()
                        ,&Fcs::Mount::signalElevation
                        ,pobjHandler, &clsSlot::notify);

pobjHandler 是一个指向 clsSlot 实例的指针。

4

1 回答 1

3
QObject::connect(Fcs::Mount::GetRef()
    ,&Fcs::Mount::signalElevation
    ,pobjHandler, &clsSlot::notify);

上述代码的问题在于有多个notify函数(即,因为它已重载)。您必须准确说明要连接哪一个。您可以使用强制转换来实现,但在这种情况下,您应该只使用较旧的 Qt 语法。例如:

connect(sender, SIGNAL(signalFn(float)), this, SLOT(notify(float)));
connect(sender, SIGNAL(signalFn(uint)), this, SLOT(notify(uint)));

显然,上面的连接代码只是语法的一个示例,您需要用适当的代码填充它(例如,替换senderFcs::Mount::GetRef()也许)。


编辑:这是 Qt 文档的链接,解释了为什么必须将旧语法用于重载。

超载

正如您可能在上面的示例中看到的,连接到 QAbstractSocket::error 并不是很漂亮,因为 error 有一个重载,并且获取重载函数的地址需要显式转换,例如,之前建立的连接如下:

connect(mySpinBox, SIGNAL(valueChanged(int)), mySlider, SLOT(setValue(int));

不能简单地转换为:

connect(mySpinBox, &QSpinBox::valueChanged, mySlider, &QSlider::setValue);

...因为 QSpinBox 有两个名为 valueChanged() 的信号具有不同的参数。相反,新代码需要:

connect(mySpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), mySlider, &QSlider::setValue);

一些宏可能会有所帮助(使用 c11 或 typeof 扩展)最好的办法可能是建议不要重载信号或插槽……</p>

…但我们在过去的 Qt 小版本中一直在添加重载,因为获取函数的地址不是我们支持的用例。但是现在如果不破坏源兼容性,这将是不可能的。

于 2016-05-26T14:36:08.843 回答