做这件事的起因是因为自己要频繁的写ROS,有的应用难免需要采用图形界面编程,第一想到的肯定是Qt。然而qt使用自己的qmake进行管理,但ROS使用的是CMake。本文介绍了如何在CLion中配置使用qt4。
Qt编译框架
- Qt引用了信号和槽机制,因此在语法上对C++进行了部分扩充,qt提供了moc软件对代码进行预处理。
- Qt的ui文件需要用uic软件生成ui_filename.h文件供qt中的代码文件来引用。
CMakelist配置
有了上面的两条补充知识,具体操作也很清楚了。我们只要在传统CMakelists.txt上加上moc和uic操作即可。具体为如下两条:
QT4_WRAP_UI(UI widget.ui)
QT4_WRAP_CPP(UI_CPP Widget.h)
处理后的文件名为UI和UI_CPP,在需要的地方引用即可。
实例
文件目录
.
├── bin
│ └── learn_qt_clion
├── CMakeLists.txt
├── main.cpp
├── Widget.h
└── widget.ui
CMakelist.txt
cmake_minimum_required(VERSION 3.6)
project(learn_qt_clion)
set(CMAKE_INCLUDE_CURRENT_DIR on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
include_directories(${Qt4_INCLUDE_DIRECTORIES})
include_directories(/usr/include)
QT4_WRAP_UI(UI widget.ui)
QT4_WRAP_CPP(UI_CPP Widget.h)
set(SOURCE_FILES main.cpp ${UI_CPP})
add_executable(learn_qt_clion ${SOURCE_FILES})
target_link_libraries(learn_qt_clion ${QT_LIBRARIES} )
main.cpp
#include "Widget.h"
int main(int argc, char* argv[]) {
QApplication a(argc, argv);
Widget w;
w.setGeometry(500, 200, 320, 240);
w.show();
return a.exec();
}
Widget.h
//
// Created by meng on 16-11-16.
//
#ifndef LEARN_QT_CLION_WIDGET_H
#define LEARN_QT_CLION_WIDGET_H
#include <QtGui/QtGui>
#include <QtCore/QtCore>
#include <QtCore/QObject>
#include "ui_widget.h"
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget* parent = 0){
m_iCount = 0;
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotPushButton()));
}
~Widget(){}
private slots:
void slotPushButton(){
++m_iCount;
ui.lineEdit->setText(QString::number(m_iCount));
}
private:
Ui::Form ui;
int m_iCount;
};
#endif //LEARN_QT_CLION_WIDGET_H