Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cmake的跨平台Qt5项目_Qt_Cmake_Qt5_Qmainwindow - Fatal编程技术网

使用cmake的跨平台Qt5项目

使用cmake的跨平台Qt5项目,qt,cmake,qt5,qmainwindow,Qt,Cmake,Qt5,Qmainwindow,我对Qt4很熟悉,但我们正在努力过渡到Qt5,这非常困难。我正在尝试创建一个非常简单的应用程序,我使用Qt-PRO文件让它工作,但我们需要基于cmake使构建服务器满意 我得到的错误是MainWindow.cpp中构造“Ui(新Ui::MainWindow)”的行中的“无效使用不完整类型'struct Ui::MainWindow'” 以下是我的文件(简化为缩短此帖子): 主窗口 #include <QtWidgets/QMainWindow> namespace Ui { clas

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

我得到的错误是MainWindow.cpp中构造“Ui(新Ui::MainWindow)”的行中的“无效使用不完整类型'struct Ui::MainWindow'”

以下是我的文件(简化为缩短此帖子):

主窗口

#include <QtWidgets/QMainWindow>
namespace Ui { class MainWindow; }
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *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(同样,一些行被截断以保持此帖子简短):

#包括“./src/mainwindow.h”
#包括
#包括
QT\u开始\u运行\u名称空间
void主窗口::qt_static_metacall(QObject*_o,QMetaObject::调用_c,int id,void**a)
{
Q_未使用(_o);
Q_未使用(_id);
Q_未使用(_c);
Q_未使用(_a);
}
QT_END_MOC_名称空间
我猜MainWindow::qt_static_metacall()是在Q_对象宏的MainWindow.h中声明的。这意味着我不知道这个神秘的Ui::MainWindow来自哪里。或者不是

更新


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

证明我对Qt的理解是完全错误的。moc并没有生成这些ui文件,它在做其他的魔法来让信号和插槽工作。解决方案是将此链接添加到CMakeLists.txt:

qt5_wrap_ui(uifiles src/mainwindow.ui)
#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
qt5_wrap_ui(uifiles src/mainwindow.ui)