2014-01-16 158 views
0

我對Qt4很熟悉,但我們正在嘗試轉換到Qt5並且它非常困難。我正在嘗試創建一個非常簡單的應用程序,並且使用Qt PRO文件工作,但我們需要將其基於cmake來保持構建服務器的快樂。使用cmake的跨平臺Qt5項目

我得到的錯誤是「在mainwindow.cpp中它構造」ui(new Ui :: MainWindow)「的行中使用了不完整類型'struct Ui :: MainWindow'」。

這裏是我的文件(簡化,以縮短這個帖子):

mainwindow.h

#include <QtWidgets/QMainWindow> 
namespace Ui { class MainWindow; } 
class MainWindow : public QMainWindow 
{ 
Q_OBJECT 
public: 
explicit MainWindow(QWidget *parent = 0); 
~MainWindow(); 
private: 
Ui::MainWindow *ui; 
}; 

mainwindow.cpp

#include "mainwindow.h" 
#include "moc_mainwindow.cpp" 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ } 
MainWindow::~MainWindow() 
{ delete ui; } 

的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9 FATAL_ERROR) 
PROJECT(Test) 
set(CMAKE_AUTOMOC TRUE) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
find_package(Qt5Core REQUIRED) 
find_package(Qt5Widgets REQUIRED) 
file (GLOB Sources src/*.cpp) 
add_executable(Test ${Sources} src/mainwindow.ui) 
qt5_use_modules(Test Widgets) 

我確定我在想你摹東西很明顯,但我一直在尋找了一整天,不知道這一個了...

縱觀產生moc_mainwindow.cpp(再次,一些線路截斷,以保持這個職位短):

#include "../src/mainwindow.h" 
#include <QtCore/qbytearray.h> 
#include <QtCore/qmetatype.h> 
QT_BEGIN_MOC_NAMESPACE 
void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) 
{ 
Q_UNUSED(_o); 
Q_UNUSED(_id); 
Q_UNUSED(_c); 
Q_UNUSED(_a); 
} 
QT_END_MOC_NAMESPACE 

我猜測MainWindow :: qt_static_metacall()是在我的mainwindow.h中的Q_OBJECT宏中聲明的。這意味着我不知道這個神祕的Ui :: MainWindow來自哪裏。或不。

UPDATE

的問題似乎是,在我的mainwindow.cpp,我要#包括「ui_mainwindow.h」而不是「moc_mainwindow.cpp」,但沒有產生「ui_mainwindow.h」 ,只有moc_mainwindow.cpp。

回答

1

原來我對Qt的理解完全是錯誤的。 moc不會生成這些ui文件,它正在發揮其他魔術的作用,使信號槽&工作。解決方法是將此鏈接添加到CMakeLists.txt中:

qt5_wrap_ui(uifiles src/mainwindow.ui)