pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

在 Qt 5 中連接過(guò)載的信號(hào)和插槽

Connecting overloaded signals and slots in Qt 5(在 Qt 5 中連接過(guò)載的信號(hào)和插槽)
本文介紹了在 Qt 5 中連接過(guò)載的信號(hào)和插槽的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我無(wú)法掌握 Qt 5 中的新信號(hào)/插槽語(yǔ)法(使用指向成員函數(shù)的指針),如 新的信號(hào)槽語(yǔ)法.我試著改變這個(gè):

I'm having trouble getting to grips with the new signal/slot syntax (using pointer to member function) in Qt 5, as described in New Signal Slot Syntax. I tried changing this:

QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                 slider, SLOT(setValue(int));

為此:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);

但是當(dāng)我嘗試編譯它時(shí)出現(xiàn)錯(cuò)誤:

but I get an error when I try to compile it:

錯(cuò)誤:沒(méi)有匹配的函數(shù)調(diào)用QObject::connect(QSpinBox*&,<未解析的重載函數(shù)類型>, QSlider*&, void(QAbstractSlider::*)(int))

error: no matching function for call to QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))

我在 Linux 上嘗試過(guò)使用 clang 和 gcc,都使用 -std=c++11.

I've tried with clang and gcc on Linux, both with -std=c++11.

我做錯(cuò)了什么,我該如何解決?

What am I doing wrong, and how can I fix it?

推薦答案

這里的問(wèn)題是有兩個(gè)具有該名稱的信號(hào):QSpinBox::valueChanged(int)QSpinBox::valueChanged(QString)代碼>.從 Qt 5.7 開始,提供了幫助函數(shù)來(lái)選擇所需的重載,因此您可以編寫

The problem here is that there are two signals with that name: QSpinBox::valueChanged(int) and QSpinBox::valueChanged(QString). From Qt 5.7, there are helper functions provided to select the desired overload, so you can write

connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
        slider, &QSlider::setValue);

對(duì)于 Qt 5.6 及更早版本,您需要通過(guò)將其轉(zhuǎn)換為正確的類型來(lái)告訴 Qt 您想要選擇哪一個(gè):

For Qt 5.6 and earlier, you need to tell Qt which one you want to pick, by casting it to the right type:

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

我知道,它丑陋.但是沒(méi)有辦法解決這個(gè)問(wèn)題.今天的教訓(xùn)是:不要讓信號(hào)和槽過(guò)載!

I know, it's ugly. But there's no way around this. Today's lesson is: do not overload your signals and slots!

附錄:演員陣容真正令人討厭的是

Addendum: what's really annoying about the cast is that

  1. 一個(gè)重復(fù)兩次類名
  2. 即使返回值通常是void(對(duì)于信號(hào)),也必須指定返回值.
  1. one repeats the class name twice
  2. one has to specify the return value even if it's usually void (for signals).

所以我發(fā)現(xiàn)自己有時(shí)會(huì)使用這個(gè) C++11 代碼片段:

So I've found myself sometimes using this C++11 snippet:

template<typename... Args> struct SELECT { 
    template<typename C, typename R> 
    static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { 
        return pmf;
    } 
};

用法:

connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)

我個(gè)人覺(jué)得它不是很有用.我希望當(dāng) Creator(或您的 IDE)在自動(dòng)完成獲取 PMF 的操作時(shí)自動(dòng)插入正確的演員表時(shí),這個(gè)問(wèn)題會(huì)自行消失.但與此同時(shí)...

I personally find it not really useful. I expect this problem to go away by itself when Creator (or your IDE) will automatically insert the right cast when autocompleting the operation of taking the PMF. But in the meanwhile...

注意:基于 PMF 的連接語(yǔ)法不需要 C++11

Note: the PMF-based connect syntax does not require C++11!

附錄 2:在 Qt 5.7 中添加了輔助函數(shù)來(lái)緩解這種情況,以我上面的解決方法為模型.主要的幫手是 qOverload(你我也有 qConstOverloadqNonConstOverload).

Addendum 2: in Qt 5.7 helper functions were added to mitigate this, modelled after my workaround above. The main helper is qOverload (you've also got qConstOverload and qNonConstOverload).

使用示例(來(lái)自文檔):

Usage example (from the docs):

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, QString);
};

// requires C++14
qOverload<>(&Foo:overloadedFunction)
qOverload<int, QString>(&Foo:overloadedFunction)

// same, with C++11
QOverload<>::of(&Foo:overloadedFunction)
QOverload<int, QString>::of(&Foo:overloadedFunction)

<小時(shí)>

附錄 3:如果您查看任何重載信號(hào)的文檔,現(xiàn)在文檔本身清楚地說(shuō)明了重載問(wèn)題的解決方案.例如,https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 說(shuō)


Addendum 3: if you look at the documentation of any overloaded signal, now the solution to the overloading problem is clearly stated in the docs themselves. For instance, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 says

注意:信號(hào) valueChanged 在此類中被重載.為了使用函數(shù)指針語(yǔ)法連接到這個(gè)信號(hào),Qt 提供了一個(gè)方便的助手來(lái)獲取函數(shù)指針,如下例所示:

Note: Signal valueChanged is overloaded in this class. To connect to this signal by using the function pointer syntax, Qt provides a convenient helper for obtaining the function pointer as shown in this example:

   connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });

這篇關(guān)于在 Qt 5 中連接過(guò)載的信號(hào)和插槽的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 振动台-振动试验台-振动冲击台-广东剑乔试验设备有限公司 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 标准品网_标准品信息网_【中检计量】 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 婚博会2024时间表_婚博会门票领取_婚博会地址-婚博会官网 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 迪威娱乐|迪威娱乐客服|18183620002| 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 一航网络-软件测评官网|