首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5.6信号和插槽超载

Qt5.6信号和插槽超载
EN

Stack Overflow用户
提问于 2016-05-26 14:08:57
回答 1查看 1.1K关注 0票数 1

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

是否可以使用重载的方法作为插槽?

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

代码语言:javascript
复制
    void notify(uint uintData);
    void notify(float fltData);

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

代码语言:javascript
复制
    QObject::connect: No such slot clsSlot::notify(float)

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

但它不..。

来自课堂上的“clsSlot”:

代码语言:javascript
复制
    public slots:
        void notify(uint uintValue);
        void notify(float fltValue);

执行情况:

代码语言:javascript
复制
    void clsSlot::notify(float fltValue) {
        notifyPrimitive(meID, QString::number(fltValue));
    }
    void clsSlot::notify(uint uintValue) {
        notifyPrimitive(meID, QString::number(uinValue));
    }

连接呼叫:

代码语言:javascript
复制
        QObject::connect(Fcs::Mount::GetRef()
                        ,&Fcs::Mount::signalElevation
                        ,pobjHandler, &clsSlot::notify);

pobjHandler是指向clsSlot实例的指针。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 14:36:08

代码语言:javascript
复制
QObject::connect(Fcs::Mount::GetRef()
    ,&Fcs::Mount::signalElevation
    ,pobjHandler, &clsSlot::notify);

上面的代码的问题是有多个notify函数(即,因为它重载了)。你必须准确地说明哪一个是连接的。您可以使用强制转换来完成该操作,但在本例中,您应该只使用较早的Qt语法。例如:

代码语言:javascript
复制
connect(sender, SIGNAL(signalFn(float)), this, SLOT(notify(float)));
connect(sender, SIGNAL(signalFn(uint)), this, SLOT(notify(uint)));

显然,上面的连接代码只是语法的一个例子,您需要用适当的代码填充它(例如,将sender替换为Fcs::Mount::GetRef() )。

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

过载 正如您在上面的示例中可能看到的,连接到QAbstractSocket::error并不是非常漂亮的,因为error有重载,而获取重载函数的地址需要显式转换,例如以前按以下方式进行的连接: 连接(mySpinBox,valueChanged(Int)),mySlider,时隙(setValue(Int)); 不能简单地转换为: 连接(mySpinBox,&QSpinBox::valueChanged,mySlider,&QSlider::setValue); ...because QSpinBox有两个名为valueChanged()的信号,具有不同的参数。相反,新的代码需要: 连接(mySpinBox,static_cast(&QSpinBox::valueChanged),mySlider,&QSlider::setValue); 一些宏可以帮助(使用c11或类型扩展)最好的可能是建议不要使信号过载或插槽… …但是我们在过去的Qt小版本中增加了重载,因为获取函数的地址不是我们支持的用例。但现在,如果不破坏源代码的兼容性,这是不可能的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37463291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档