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宏及控件提升导致的类重定义问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建创新数字基础设施,中泰证券携手华为迈
- 下一篇: 工信部确定5G使用频段 产业链即将迎来变