Qt槽函數不響應不執行的一種原因:ui提升導致重名

背景:

一個包含了組件提升的ui,有個按鈕的槽函數就是不響應,于是找原因。

分析:

槽函數的對應一是通過connect函數綁定信號,二是on_XXX_signal的命名方式。界面上部件的槽函數通常是第二種。

我反復確認細節,就是找不到問題。直到跟蹤moc文件,發現qt_static_metacall函數都不執行。

之前還寫過一篇博客:

qt槽函數重寫問題,qt_metacall和qt_static_metacall-CSDN博客

為了測試原因,我幾乎點了界面上所有的按鈕,其它都可以執行qt_static_metacall,直到發現一個低級原因:界面上如果用嵌套方式,里面又套了一層widget,并讓它提升為另一個自定義的界面,其中有個按鈕的名稱和外面的重復,這就不行了。比如:

原因:

186ab805bfa34b97b7a51b48a4b740bf.png

如圖所示:一個主ui中嵌套了一個子ui,子ui里面有個pushButton1,主ui里也有一個,這樣就不行。按理說,這就好比函數或者模塊化設計,分離開來就是怕亂,但是不行,分離開也要注意命名。

在cpp的構造函數中,通常有個setupUi函數,而它存在于ui_XXX.h當中,這就是原因。

主ui的cpp的ui_頭文件中,一定會有子ui的ui_頭文件。正如我的ui里放了個按鈕,那么它的ui_頭文件里一定會有#include <QPushButton>。要不構造的時候調用setupUi,怎么生成這個按鈕?

所以,放眼主ui的cpp文件,開頭一定是:

#include "my_ui.h"

#include "ui_my_ui.h"

按上圖的意思,ui_頭文件當中展開,成了:

#include "my_ui.h"

...

#include "my_sub_ui.h"

...

而主ui和子ui中都有一樣名字的按鈕pushButton1,所以my_ui.h和my_sub_ui.h中也一樣會有兩個槽函數的聲明on_pushButton1_clicked。編譯器咋整?如果按照名字匹配信號槽,效果跟connect是一樣的,但又不完全一樣,主界面中的槽函數等于被覆蓋了,所以有效的永遠是子ui中的槽函數。

亂七八糟的不知道說明白了沒有。畢竟qt按照名字on_XXX_signal匹配信號槽的做法,跟connect還是有區別,這個感興趣可以分析源碼。

結論:

所以,如果有ui嵌套,控件命名一定不能重復。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211853.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寫一個程序拷貝文件

使用所學文件操作&#xff0c;在當前目錄下放一個文件data.txt&#xff0c;寫一個程序&#xff0c;將data.txt文件拷貝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打開文件data.txt&#xff0c;讀取數據打開文件data_copy.txt&#xff0c;寫數據從data.t…

如何使用拼多多根據ID取商品詳情 API 獲取熱銷商品信息?

使用拼多多根據ID取商品詳情 API 獲取熱銷商品信息是一種高效且便捷的方式&#xff0c;可以快速獲取到拼多多平臺上熱銷商品的信息。以下是獲取熱銷商品信息的步驟和示例代碼&#xff1a; 一、步驟 注冊成為拼多多開發者&#xff0c;并獲取API密鑰。確定要獲取熱銷商品信息的…

張正友相機標定法原理與實現

張正友相機標定法是張正友教授1998年提出的單平面棋盤格的相機標定方法。傳統標定法的標定板是需要三維的,需要非常精確,這很難制作,而張正友教授提出的方法介于傳統標定法和自標定法之間,但克服了傳統標定法需要的高精度標定物的缺點,而僅需使用一個打印出來的棋盤格就可…

.Faust勒索病毒解密方法|勒索病毒解決|勒索病毒恢復|數據庫修復

引言&#xff1a; 數字時代的黑暗勢力中&#xff0c;faust勒索病毒如幽靈般潛伏&#xff0c;將用戶的數字珍寶變為數字枷鎖。本文將深入介紹.faust勒索病毒的威脅特征&#xff0c;提供有效的數據恢復方法&#xff0c;并分享一系列預防措施&#xff0c;以協助您在數字戰場上筑起…

kafka學習筆記--如何保證生產者數據可靠、不重復、有序

本文內容來自尚硅谷B站公開教學視頻&#xff0c;僅做個人總結、學習、復習使用&#xff0c;任何對此文章的引用&#xff0c;應當說明源出處為尚硅谷&#xff0c;不得用于商業用途。 如有侵權、聯系速刪 視頻教程鏈接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;從入門到調優…

名字的漂亮度

給出一個字符串&#xff0c;該字符串僅由小寫字母組成&#xff0c;定義這個字符串的“漂亮度”是其所有字母“漂亮度”的總和。 每個字母都有一個“漂亮度”&#xff0c;范圍在1到26之間。沒有任何兩個不同字母擁有相同的“漂亮度”。字母忽略大小寫。給出多個字符串&#xff0…

從零開發短視頻電商 Low Level Client(推薦)連接OpenSearch進行CRUD

文章目錄 依賴初始化客戶端發起請求請求參數請求頭設置超時時間設置線程數設置用戶名密碼結果解析節點選擇器配置嗅探器整體示例問題參考 OpenSearch開發環境安裝Docker和Docker-Compose兩種方式 依賴 <dependency><groupId>org.elasticsearch.client</groupId…

【腳本】圖片-音視頻-壓縮文件處理

音視頻處理 一&#xff0c;圖片操作1&#xff0c;轉換圖片格式2&#xff0c;多張圖片合成視頻 二&#xff0c;音頻操作1&#xff0c;轉換音頻格式2&#xff0c;分割音頻為多段3&#xff0c;合成多段音頻 三&#xff0c;視頻操作1&#xff0c;轉換視頻格式2&#xff0c;提取視頻…

【Go自學版】01-基礎

// 變量 var a, b, c 8, 2.3, "hello" var d float64; e : 6var A []int; var B [10]int; C : [10]int{1, 2, 3, 4} for i : 0; i < len(B); i {} for _, value : range C {} D make([]int, 3) // len 4, cap 10, 擴容方式 cap*2 E : make([]int, 4, 10) E …

掌握PyTorch數據預處理(一):讓模型表現更上一層樓!!!

引言 在PyTorch中&#xff0c;數據預處理是模型訓練過程中不可或缺的一環。通過精心優化數據&#xff0c;我們能夠確保模型在訓練時能夠更高效地學習&#xff0c;從而在實際應用中達到更好的性能。今天&#xff0c;我們將深入探討一些常用的PyTorch數據預處理技巧&#xff0c;…

C++如何通過調用ffmpeg接口對H264文件進行編碼和解碼

C可以通過調用FFmpeg的API來對H264文件進行編碼和解碼。下面是一個簡單的例子。 首先需要在代碼中包含FFmpeg的頭文件&#xff1a; extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale…

Linux系統編程:進程間通信總結

管道 在Linux中&#xff0c;管道是一種進程間通信方式&#xff0c;它允許一個進程&#xff08;寫入端&#xff09;將其輸出直接連接到另一個進程&#xff08;讀取端&#xff09;的輸入。從本質上說&#xff0c;管道也是一種文件&#xff0c;但它又和一般的文件有所不同。 具體…

Docker部署開源分布式任務調度平臺DolphinScheduler并實現遠程訪問辦公

文章目錄 前言1. 安裝部署DolphinScheduler1.1 啟動服務 2. 登錄DolphinScheduler界面3. 安裝內網穿透工具4. 配置Dolphin Scheduler公網地址5. 固定DolphinScheduler公網地址 前言 本篇教程和大家分享一下DolphinScheduler的安裝部署及如何實現公網遠程訪問&#xff0c;結合內…

前端知識筆記(二十七)———CSS核心功能手冊:從熟悉到精通

參考HTML代碼 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

12.9_黑馬數據結構與算法筆記Java

目錄 057 多路遞歸 e03 楊輝三角2 thinking&#xff1a;二維數組的動態初始化&#xff1f; 057 多路遞歸 e03 楊輝三角3 058 鏈表 e01 反轉單向鏈表1 058 鏈表 e01 反轉單向鏈表2 058 鏈表 e01 反轉單向鏈表3 遞歸 058 鏈表 e01 反轉單向鏈表4 為什么是returnn1呢&…

【Cisco Packet Tracer】路由器 NAT實驗

NAT的實現方式有三種&#xff0c;即靜態轉換Static Nat、動態轉換Dynamic Nat和端口多路復用OverLoad。 靜態轉換是指內部本地地址一對一轉換成內部全局地址&#xff0c;相當內部本地的每一臺PC都綁定了一個全局地址。一般用于在內網中對外提供服務的服務器。 [3] 動態轉換是指…

C++ 迭代器

迭代器 迭代器類似于指針類型&#xff0c;也提供了對對象的間接訪問。 就迭代器而言&#xff0c;其對象是容器中的元素或 string 對象中的字符。 獲取迭代器 容器的迭代器類型 使用作用域運算符來說明我們希望使用的類型成員&#xff1b;例&#xff1a;string::iterator it…

探秘MSSQL存儲過程:功能、用法及實戰案例

在現代軟件開發中&#xff0c;高效地操作數據庫是至關重要的。而MSSQL&#xff08;Microsoft SQL Server&#xff09;作為一款強大的關系型數據庫管理系統&#xff0c;為我們提供了豐富的功能和工具來處理數據。其中&#xff0c;MSSQL存儲過程是一項強大而又常用的功能&#xf…

改進YOLOv8注意力系列一:結合ACmix、Biformer、BAM注意力機制

???改進YOLOv8注意力系列一:結合ACmix、Biformer、BAM注意力機制 代碼ACmixBiFormerBAMBlock加入方法各種yaml加入結構本文提供了改進 YOLOv8注意力系列包含不同的注意力機制以及多種加入方式,在本文中具有完整的代碼和包含多種更有效加入YOLOv8中的yaml結構,讀者可以獲…

C++ 的關鍵字(保留字)介紹

一.C中部分關鍵字的用法 1. auto 關鍵字auto是C11引入的&#xff0c;它可以用于變量聲明和函數返回類型的推導。當你不關心變量的具體類型時&#xff0c;可以使用auto來讓編譯器根據初始化表達式推導出變量的類型。這樣可以簡化代碼&#xff0c;提高可讀性。 1.在for循環中遍…