CMake жалуется на отсутствие файла autoui c - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь создать HelloWorld в подкаталогах, используя automo c и autoui c.

У меня есть главный каталог с

cmake_minimum_required(VERSION 3.1.0)

project(helloworld)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()

find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_subdirectory(main)
add_subdirectory(QtGUI)         

и в подкаталоге main

add_executable(helloworld
    main.cpp
)

include_directories(
        include
        ../QtGUI/include
)

target_link_libraries(helloworld libQtGUI ) 

и

#include <qapplication.h>
#include <qpushbutton.h>
#include "dialog.h"

int main( int argc, char **argv )
{
  QApplication a( argc, argv );
  Dialog w;
  w.show();
  return a.exec();
}

В файле QtGUI / dialog. cpp

#include "forms/ui_dialog.h"
#include "dialog.h"
#include "dialog.moc"

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

Dialog::~Dialog()
{
    delete ui;
}

в файле QtGUI / CMakeLists.txt

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

#set(AUTOUIC_SEARCH_PATHS  forms)
file(GLOB_RECURSE QOBJECT_SOURCES
    dialog.cpp
)


include_directories(
      ${Qt5Widgets_INCLUDE_DIRS}
      ${CMAKE_BINARY_DIR}
      include
      forms
)

ADD_LIBRARY(libQtGUI ${QOBJECT_SOURCES} )

file(GLOB_RECURSE HEADERS_TO_MOC include/ *.h)
qt5_wrap_cpp(PROCESSED_MOCS
             ${HEADERS_TO_MOC}
             TARGET libQtGUI
             OPTIONS --no-notes) # Don't display a note for the headers which don't produce a moc_*.cpp

target_sources(libQtGUI PRIVATE ${PROCESSED_MOCS}) # This adds generated moc cpps to target


# Use the Widgets module from Qt 5.
target_link_libraries(libQtGUI Qt5::Widgets )

set_target_properties(libQtGUI PROPERTIES OUTPUT_NAME QtGUI
                      )

target_include_directories(libQtGUI PUBLIC
      ${Qt5Widgets_INCLUDE_DIRS}
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)

и QtGUI / include / dialog.h равен

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QString>
//#include "mythread.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    virtual ~Dialog();
private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

Без использования AUTOUI C (т.е. когда я генерирую ui_dialog.h вручную, он компилируется и запускается, но я получаю

The file includes the moc file "dialog.moc", but does not contain a Q_OBJECT, Q_GADGET or Q_NAMESPACE macro.

предупреждение. Когда я пытаюсь использовать AUTOUI C, я получаю сообщение об ошибке:

fatal error: ui_dialog.h: No such file or directory
 #include "ui_dialog.h"

Что я делаю не так? Согласно документам,

"If a preprocessor #include directive is found which matches <path>ui_<basename>.h, and a <basename>.ui file exists, then uic will be executed to generate the appropriate file. "

Я ожидал, что будут сгенерированы формы / ui_dialog.h.

(у меня есть файл dialog.ui как в Qt GUI, так и в QtGUI / forms)

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="StartButton">
   <property name="geometry">
    <rect>
     <x>150</x>
     <y>60</y>
     <width>89</width>
     <height>25</height>
    </rect>
   </property>
   <property name="text">
    <string>Start</string>
   </property>
  </widget>
  <widget class="QPushButton" name="StopButton">
   <property name="geometry">
    <rect>
     <x>280</x>
     <y>60</y>
     <width>89</width>
     <height>25</height>
    </rect>
   </property>
   <property name="text">
    <string>Stop</string>
   </property>
  </widget>
  <widget class="QTextBrowser" name="label">
   <property name="geometry">
    <rect>
     <x>20</x>
     <y>60</y>
     <width>121</width>
     <height>31</height>
    </rect>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Файл пользовательского интерфейса создается в $ {CMAKE_CURRENT_BINARY_DIR}, а не в $ {CMAKE_BINARY_DIR} - поэтому включите этот путь и посмотрите, работает ли он.

0 голосов
/ 15 марта 2020

Я не вижу причин иметь дубликаты файлов пользовательского интерфейса; похоже, что первый используется для генерации, но второй, как ожидается, существует. Затем, чтобы решить

  1. проблему пользовательского интерфейса, удалите dialog.ui из папки Qt GUI (сохраняйте только файл пользовательского интерфейса в подпапке 'forms')
  2. предупреждение в порядке, потому что вы не у вас нет этих зарезервированных слов в файле CPP, т. е. из вашего CPP нечего сгенерировать упомянутая документация находится в разделе «Обработка исходного файла». Просто удалите этот элемент dialog.mo c. И он будет работать как положено.

Теперь он компилируется и запускается без предупреждений / проблем.

...