Я пытался использовать 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"
имя файла и нажмите F2, тогда я получаю следующее сообщение об ошибке:
Я исследовал проблему: она происходит из разных мест, упомянутых в файле 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
директива и прочее.
Основная проблема в том, что я не могу создать слот из редактора форм Перейти в слот пункт контекстного меню для автоматического создания слота из Qt Cretator.
Наконец я нашел обходной путь. Это Qt Creatorограничение синтаксического анализатора: указатель на Ui::MainWindow
должен быть простой старый необработанный указатель. То есть я не могу использовать какую-либо RAII-обертку, вроде std::unique_ptr
или же QScopedPointer
и должен вручную delete
Ui::MainWindow
экземпляр во время уничтожения. Может быть, иногда это будет исправлено хотя бы для QScopedPointer
, Я надеюсь.
Других решений пока нет …