c++ - Qt Creator 无法识别在 Qt : location ui_*. h 中使用 CMake

标签 c++ qt cmake auto-generate uic

我尝试使用 Qt Creator 来管理用户界面文件 *.ui:

主窗口.cpp:

#include "mainwindow.hpp"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget * parent)
    : QMainWindow{parent}
    , ui{new Ui::MainWindow}
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{ ; }

主窗口.hpp:

#pragma once

#include <QMainWindow>
#include <QScopedPointer>

namespace Ui {

class MainWindow;

}

class MainWindow
        : public QMainWindow
{

    Q_OBJECT

public :

    explicit MainWindow(QWidget * parent = Q_NULLPTR);
    ~MainWindow();

private :

    QScopedPointer< Ui::MainWindow > ui;

    Q_DISABLE_COPY(MainWindow)

};

CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)

project("gui" LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt5 CONFIG REQUIRED Core Widgets)

set(UI_FILES "mainwindow.ui")

set(SOURCES)
list(APPEND SOURCES "main.cpp")
list(APPEND SOURCES "mainwindow.cpp")

add_executable(${PROJECT_NAME} ${OS_BUNDLE} ${SOURCES} ${UI_FILES})

target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Widgets)

set_target_properties(${PROJECT_NAME} PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED YES
    CXX_EXTENSIONS YES
    )

当我将光标放在 #include "ui_mainwindow.h" 文件名上并按 F2 时,我收到以下错误消息:

error messagbox

我调查了这个问题:它起源于不同的位置,在文件 D:/Projects/build/proj/Debug/src/gui/CMakeFiles/gui.dir/CXX.includecache 中提到:

gui_autogen/include/ui_mainwindow.h
D:/Projects/proj/gui/gui_autogen/include/ui_mainwindow.h

这是连续的两行,整个文件中仅包含 ui_mainwindow.h 作为子字符串。第二行包含错误的位置,即使我将 target_include_directories(${PROJECT_NAME} PRIVATE "${PROJECT_BINARY_DIR}/gui_autogen/include") 添加到 CMakeLists.txt,然后 cmake 两种方式都无法生成正确的缓存文件。

有什么解决方法?我想我可以在 CMake 发行版的 Qt 子系统中编辑(修补)一些 *.cmake 文件。我几乎可以肯定这与 CMAKE_AUTOMOC 指令和其他内容密切相关。

附加:

主要问题是我无法从表单编辑器的 Go to slot 上下文菜单项创建槽以从 Qt Cretator 自动生成槽。

最佳答案

我终于找到了解决方法。这是 Qt Creator 的解析器限制:指向 Ui::MainWindow 的指针应该是一个普通的旧原始指针。那就是我不能使用任何 RAII 包装器,例如 std::unique_ptrQScopedPointer 并且应该手动delete Ui::MainWindow 销毁时的实例。也许有时它至少对于 QScopedPointer 会被修复。我希望。

关于c++ - Qt Creator 无法识别在 Qt : location ui_*. h 中使用 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43980265/

相关文章:

c++ - 将{pointer to function with C linkage}分配给{pointer to function with C++ linkage},反之亦然

c++ - 如何让用户垂直调整窗口大小

c++ - 如何在小部件上单击 "What' s“此”按钮时得到通知?

c++ - 模块/videoio/cmake/detect_ffmpeg.cmake :16 处的 CMake 错误

c++ - CMake - FLANN 库不构建(对于 PCL 库)

c++ - 在命名空间中定义结构的成员

c++ - Qt 子目录包含类

c++ - CMake 使用 clang 而不是 clang++

c++ - 为什么 sizeof(!0) 打印 1 而不是 4?

python - 在 PyQT 中如何存储 QRunnable 中信号发出的数据