日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Qt-Q_OBJECT宏及控件提升导致的类重定义问题

發布時間:2024/1/8 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt-Q_OBJECT宏及控件提升导致的类重定义问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在項目中遇到了這么個奇怪的問題,類加上Q_OBJECT宏之后,出現類重定義報錯。具體描述如下:
SelectConvertDialog是一個ui類,.ui文件中通過控件提升的方式提升QTableWidget為SelectConvertTable,而SelectConvertTable類頭文件中也加上了Q_OBJECT宏,編譯后報錯:

嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態
錯誤 C2011 “SelectConvertTable”:“class”類型重定義 (編譯源文件 D:\project\xxxxx\mocs_compilation.cpp)

分析

重定義意味著出現了兩次class SelectConvertTable聲明,但是我們顯然只聲明了一次,那么唯一的可能,就是在頭文件include的時候,將這個頭文件include了兩次

報錯的文件是mocs_compilation,其中出現了兩行include

#include <AAWEEYEOKD/moc_SelectConvertDialog.cpp> #include <AAWEEYEOKD/moc_SelectConvertTable.cpp>

我們知道moc_開頭的文件是由moc從.h文件自動幫我們生成的,查看moc_SelectConvertTable.cpp代碼,首行

#include "UIModule/SelectConvertTable.h"

moc_SelectConvertDialog.cpp首行:

#include "UIModule/SelectConvertDialog.h"

而SelectConvertDialog是一個UI界面類,具有以下include語句

#include "ui_SelectConvertDialog.h"

該文件由uic從.ui文件生成,因為我們將ui文件中的QTableWidget提升為SelectConvertTable,所以ui_SelectConvertDialog.h中會自動include頭文件SelectConvertTable.h,代碼如下:

#include "selectconverttable.h"

至此真相大白,由于qt的uic和moc系統幫助我們生成了一些代碼,導致出現重定義的問題。那要怎么解決呢?很簡單,使用#ifndef防止重復include就可以了

#ifndef SELECECONVERTTABLE_H #define SELECECONVERTTABLE_H //原SelectConvertTable.h文件內容不變 ... #endif // SELECECONVERTTABLE_H

建議

頭文件應都加上#ifndef語句,防止重復include同一個頭文件

總結

以上是生活随笔為你收集整理的Qt-Q_OBJECT宏及控件提升导致的类重定义问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。