使用cmake的跨平台Qt5项目

时间:2014-01-16 22:52:35

标签: qt cmake qt5 qmainwindow

我对Qt4很熟悉,但我们正试图过渡到Qt5,这很困难。我正在尝试创建一个非常简单的应用程序,并且我使用Qt PRO文件工作,但我们需要将其基于cmake以保持构建服务器满意。

我得到的错误是“在mainwindow.cpp的行中无效使用不完整类型'struct Ui :: MainWindow'”,它构造了“ui(new 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()是在Q_OBJECT宏的mainwindow.h中声明的。这意味着我不知道这个神秘的Ui :: MainWindow来自哪里。或者不是。

更新

问题似乎是在我的mainwindow.cpp中,我应该#including“ui_mainwindow.h”而不是“moc_mainwindow.cpp”,但是没有生成“ui_mainwindow.h”,只有moc_mainwindow.cpp。

1 个答案:

答案 0 :(得分:1)

原来我对Qt的理解完全错了。 moc不生成那些ui文件,它正在做其他魔术来制作信号&amp;插槽工作。解决方案是将此链接添加到CMakeLists.txt:

qt5_wrap_ui(uifiles src/mainwindow.ui)