【发布时间】:2014-08-03 04:07:11
【问题描述】:
我正在使用 Qt Creator 3.1.2/Qt4.8.6 和 CMake3.0.0。请注意,如果您担心我的 CMakeLists.txt,我正在使用 SceniX API,但这不会影响这一点。但是,在编译由 Qt Creator 生成的 UI 时,出现以下错误:
D:\Projects\C Projects\MyProjectName\ui\masterui.cpp:6: error: C2512: 'Ui::MasterUI' : no appropriate default constructor available
但是,默认构造函数是可用的。这些是 Qt Creator 生成的默认文件,并设置为在 CMake 中使用。它们在试验时可能会稍作修改,但从未奏效。
我将按此顺序分享我的 masterui.h / masterui.cpp / CMakeLists.txt。
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
【问题讨论】:
-
是什么让你认为“默认构造函数可用”?为
Ui::MasterUI定义的唯一构造函数带有一个参数。 -
不带参数结果是一样的。它适用于 QMake。
-
从构造函数中删除“显式”关键字有帮助吗?
-
遗憾的是没有任何区别。
-
默认构造函数是指“ui_MasterUI.h”中的类,文件内容是什么,有没有默认构造函数?
标签: c++ qt qt4 cmake qt-creator