1 qtcreator使用cmake编译项目,去掉命令行窗口

在Visula Studio + CMake构建项目,通常默认是带有命令行窗口,通过设置如下命令,去掉命令行窗口。

cmake命令1:

add_executable(${PROJECT_NAME}
  WIN32)

cmake命令2:

set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE true)

在qtcreator构建cmake项目时,通常都是没有命令行窗口,但是,最近在使用qtcreator构建VTK相关的项目时,出现了蛋疼的一幕,编译生成的程序,一定会有命令行窗口,这时,如果设置上述两条cmake命令中的一条,都会报错 MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain 非常奇怪,怎么整都没有用。

stack overflow网页下,有人说使用

CMAKE_POLICY(SET CMP0020 NEW)

命令后,再使用上述两条命令中的任意一条就可以解决,经实验后,确实如此。

2 cmake构建qt4项目

使用cmake构建关于qt4项目,特别是自己编译qt4源码后,用cmake构建的qt4项目,问题很多。我们需要注意以下几点:

(1) 必须设置环境变量Path对应的目录是编译qt4源码中的bin目录

当然,环境编译不一定需要在wins的环境窗口中设置,也可以在CMakeLists.txt文件中设置,设置代码如下:

# wins上设置
set(ENV{PATH} "$ENV{PATH};D:/qt-4.8.6/bin") 
# linux设置
set(ENV{PATH} "$ENV{PATH}:/usr/local/bin")

(2) 下面这种情况描述起来,比较复杂

编译Qt4源码后,使用qt4_automoc命令,无法生成moc文件

必须调用set(CMAKE_AUTOMOC ON)命令,才能成moc文件

如果在qt官方网站上下载的Qt4安装包,安装后,使用qt4_automoc命令,却可以生产moc文件

(3) 编译Qt4源码,使用cmake构建项目,代码示例:

cmake_minimum_required(VERSION 2.6)

project(demo)

# 添加环境变量到Path
set(ENV{PATH} "$ENV{PATH};D:/qt-4.8.6/bin")

# 设置qt中相关路径
set(QT_MOC_EXECUTABLE "D:/qt-4.8.6/bin/moc.exe")
set(QT_RCC_EXECUTABLE "D:/qt-4.8.6/bin/rcc.exe")
set(QT_UIC_EXECUTABLE "D:/qt-4.8.6/bin/uic.exe")
set(QT_UIC3_EXECUTABLE "D:/qt-4.8.6/bin/uic3.exe")

# 生成moc文件
set(CMAKE_AUTOMOC ON)

find_package(Qt4 REQUIRED)

include( ${QT_USE_FILE} )

include_directories(${QT_INCLUDES}
    ${CMAKE_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}    
    ${CMAKE_CURRENT_SOURCE_DIR})
 
set(HEAD_FILE mainwindow.h)
set(CPP_FILE mainwindow.cpp main.cpp)
set(UI_FILE mainwindow.ui)
 

qt4_automoc(MOC_FILE ${HEAD_FILE})
qt4_wrap_cpp(WRAP_CPP_FILE ${HEAD_FILE})
qt4_wrap_ui(WRAP_UI_FILE ${UI_FILE})
#qt4_add_resources(MOC_RES ${Qt_RES_files})


add_executable(demo ${HEAD_FILE} ${CPP_FILE} ${UI_FILE})
target_link_libraries(demo ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} )    

3 ui文件位置

对于cmake构建的qt项目中,当ui文件位置,和h/cpp文件不在同一个目录时,是无法引用ui文件的,需要在CMakeLists.txt文件中添加下面代码:

# ui/resources是ui文件所在目录
set(CMAKE_AUTOUIC_SEARCH_PATHS "ui/resources")

4 固定大小还原

Qt界面,通过函数setFixedSize设置窗口固定大小后,如果我们想恢复窗口的初始化状态,可以采用下面方法:

// 方法1
this->layout()->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize);
// 方法2
this->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
this->setMinimumSize(0, 0);

经过试验的得知,方法1好像没有卵用,方法2可以用