1

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

mainwindow.cpp

#include "mainwindow.hpp"

#include "ui_mainwindow.h"

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

MainWindow::~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"文件名上并 pushF2时,我收到以下错误消息:

错误消息框

我已经调查了这个问题:它来自不同的位置,在文件中提到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自动生成插槽。

4

1 回答 1

0

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

于 2017-05-15T19:16:54.987 回答