I'm using Qt Creator 3.1.2/Qt4.8.6 and CMake3.0.0. Note that I'm using SceniX API if you're concerned about my CMakeLists.txt but that doesn't affect this. However, when compiling a UI generated by Qt Creator I get the following error:
D:\Projects\C Projects\MyProjectName\ui\masterui.cpp:6: error: C2512: 'Ui::MasterUI' : no appropriate default constructor available
However, the default constructor IS available. These are default files generated by Qt Creator and setup for use in CMake. They might be slightly modified while experimenting but they have never worked.
I will share my masterui.h / masterui.cpp / CMakeLists.txt in that order.
masterui.h
#ifndef MASTERUI_H
#define MASTERUI_H
#include <QWidget>
namespace Ui {
class MasterUI;
}
class MasterUI : public QWidget
{
Q_OBJECT
public:
explicit MasterUI(QWidget *parent = 0);
~MasterUI();
private:
Ui::MasterUI *ui;
};
#endif // MASTERUI_H
masterui.cpp
#include "masterui.h"
#include "ui_masterui.h"
MasterUI::MasterUI(QWidget *parent) :
QWidget(parent),
ui(new Ui::MasterUI)
{
ui->setupUi(this);
}
MasterUI::~MasterUI()
{
delete ui;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(MyProjectName)
file(TO_CMAKE_PATH $ENV{SCENIXHOME} SCENIX_HOME)
set(CMAKE_MODULE_PATH "${SCENIX_HOME}/CMake")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../exe/MyProjectName_exe")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "../exe/MyProjectName_exe")
file(GLOB sources
"src/*.cpp")
file(GLOB headers
"inc/*.h")
find_package(OpenGL REQUIRED)
find_package(SceniX REQUIRED)
find_package(NVQt4 QUIET)
find_package(Qt4 REQUIRED)
set( QT_USE_QTOPENGL TRUE )
include( ${QT_USE_FILE} )
SCENIX_SET_BINARY_FOLDERS()
QT4_ADD_RESOURCES(QTResources)
QT4_WRAP_UI(UIsrc "ui/masterui.ui")
QT4_WRAP_CPP(MOCsrc "ui/masterui.h")
ADD_EXECUTABLE(UIexe "src/main.cpp" "ui/masterui.cpp" ${MOCsrc} ${UIsrc})
file( GLOB UICsources
"${CMAKE_CURRENT_BINARY_DIR}/*.h")
set( UIC_SOURCES "${UICsources}")
set( SCENIX_COMMON_BASE "${SCENIX_HOME}/samples/common" )
file( GLOB uisources
"${SCENIX_COMMON_BASE}/src/ui/*.cpp" )
set( UI_SOURCES "${uisources}" )
set( MyProjectName_SOURCES
${sources}
${SCENIX_COMMON_BASE}/src/SimpleScene.cpp
${SCENIX_COMMON_BASE}/src/MeshGenerator.cpp
${SCENIX_COMMON_BASE}/src/SceneFunctions.cpp
${SCENIX_COMMON_BASE}/src/SceniXWidget.cpp
${SCENIX_COMMON_BASE}/Qt4/src/SceniXQGLContext.cpp
${SCENIX_COMMON_BASE}/Qt4/src/SceniXQGLWidget.cpp
${SCENIX_COMMON_BASE}/Qt4/src/SceniXQGLSceneRendererWidget.cpp
${UI_SOURCES}
${UIC_SOURCES}
${QTResources}
${UICsources}
)
set ( MyProjectName_HEADERS
${headers}
${SCENIX_COMMON_BASE}/inc/SimpleScene.h
${SCENIX_COMMON_BASE}/inc/MeshGenerator.h
${SCENIX_COMMON_BASE}/inc/SceneFunctions.h
${SCENIX_COMMON_BASE}/inc/SceniXWidget.h
${SCENIX_COMMON_BASE}/Qt4/inc/SceniXQGLContext.h
${SCENIX_COMMON_BASE}/Qt4/inc/SceniXQGLWidget.h
${SCENIX_COMMON_BASE}/Qt4/inc/SceniXQGLSceneRendererWidget.h
)
include_directories( ${SCENIX_INCLUDES} )
include_directories( ${SCENIXRT_INCLUDES} )
include_directories( "." )
include_directories( "inc" )
include_directories( "${SCENIX_COMMON_BASE}/inc" )
include_directories( "${SCENIX_COMMON_BASE}/Qt4/inc" )
include_directories( "${CMAKE_CURRENT_BINARY_DIR}" )
add_executable( MyProjectName
${MyProjectName_SOURCES}
${MyProjectName_HEADERS}
)
target_link_libraries( MyProjectName
${QT_LIBRARIES}
${SCENIX_LIBS}
${SCENIXRT_LIBS}
${OPENGL_gl_LIBRARY}
${QT_QTMAIN_LIBRARY}
)
if(TARGET SceniX)
add_dependencies( MyProjectName SceniX SceniXRT )
add_perforce_to_target( MyProjectName )
endif()
set_target_properties( MyProjectName PROPERTIES FOLDER "Samples")
ui_masterui.h
/********************************************************************************
** Form generated from reading UI file 'masterui.ui'
**
** Created by: Qt User Interface Compiler version 4.8.6
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MASTERUI_H
#define UI_MASTERUI_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_masterWidget
{
public:
void setupUi(QWidget *masterWidget)
{
if (masterWidget->objectName().isEmpty())
masterWidget->setObjectName(QString::fromUtf8("masterWidget"));
masterWidget->resize(640, 360);
masterWidget->setStyleSheet(QString::fromUtf8("background-color: rgb(71, 71, 71);"));
retranslateUi(masterWidget);
QMetaObject::connectSlotsByName(masterWidget);
} // setupUi
void retranslateUi(QWidget *masterWidget)
{
masterWidget->setWindowTitle(QApplication::translate("masterWidget", "Form", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class masterWidget: public Ui_masterWidget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MASTERUI_H
There's no Ui::MasterUI class in "ui_MasterUI.h", the closest one is Ui::masterWidget, hence you get the error.
I am guessing that you renamed MasterUI to masterWidget in Qt Designer, or by editing MasterUI.ui. This will cause Qt to generate "ui_MasterUI.h" with a Ui::masterWidget class, not Ui::MasterUI. The solution is to rename masterWidget back to MasterUI, or change masterui.cpp and masterui.h to refer to Ui::masterWidget instead of Ui::MasterUI.
Are you sure the same source files are still compilable with qmake?
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.