使用 cmake 的跨平台 Qt5 项目

Posted

技术标签:

【中文标题】使用 cmake 的跨平台 Qt5 项目【英文标题】:Cross-platform Qt5 project using cmake 【发布时间】:2014-01-16 22:52:35 【问题描述】:

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

我得到的错误是 mainwindow.cpp 中构造“ui(new Ui::MainWindow)”的行中的“无效使用不完整类型‘struct Ui::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;
;

主窗口.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中,我应该是#include“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)

【讨论】:

以上是关于使用 cmake 的跨平台 Qt5 项目的主要内容,如果未能解决你的问题,请参考以下文章

CMake学习:使用camke创建一个最简单的跨平台c++项目

使用 cmake 构建 Qt5 项目

如何将 Vulkan 添加到跨平台 CMake 项目?

cmake入门教程 跨平台项目构建工具cmake介绍

cmake入门教程 跨平台项目构建工具cmake介绍

有没有一种很好的跨平台方法来使用 CMake 包含外部 C++ 库?