C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和immediate mode。
- 其中前者是主流的桌面GUI机制框架,包括:Qt、wxwidgets、gtk、juce等
- 后者是一些游戏引擎编辑器常用的GUI机制框架,包括:imgui、nanogui等
使用这些框架都支持构建在windows、mac、linux上面能运行的桌面图形界面程序。
但如果在开发小工具项目,要求跨平台、开源免费、协议友好、性能高、轻量级的需求,这里推荐FLTK库(https://www.fltk.org/),只需要作为一个依赖库的方式引入工程即可。
以下是一个使用FLTK开发的简单demo代码示例,功能是显示一个编辑框和一个按钮,点击按钮刷新编辑框的数字。
项目结构
fltk_demo- fltk-1.3.8- src|- main.cpp- CMakeLists.txt
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)project(fltk_demo)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)if (WIN32)set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") # do not pop out console for release
endif()if (WIN32)add_definitions(-D_CRT_SECURE_NO_WARNINGS-D_WINSOCK_DEPRECATED_NO_WARNINGS)
endif()add_subdirectory(fltk-1.3.8)include_directories(fltk-1.3.8)file(GLOB SRCsrc/*.hsrc/*.cpp
)add_executable(${PROJECT_NAME} ${SRC})# both win and linux use the same lib name
target_link_libraries(${PROJECT_NAME}fltk
)
main.cpp
#include <iostream>
#include <string>
#include "FL/Fl.H"
#include "FL/Fl_Window.H"
#include "FL/Fl_Box.H"
#include "FL/Fl_Input.H"
#include "FL/Fl_Button.H"class MyWindow : public Fl_Window
{
public:MyWindow(int w, int h, const char* title) : Fl_Window(w, h, title){}void init(){std::cout << "MyWindow init" << std::endl;// uibegin();color(FL_DARK3);int y = 10;s_input = new Fl_Input(150, y, 100, 20, "Number:");s_input->static_value(s_num_str.c_str()); // set init texty += 30;Fl_Button* add_button = new Fl_Button(150, y, 60, 30, "Add Num");resizable(add_button);add_button->callback(handleAddButtonClick);end();}static void handleAddButtonClick(Fl_Widget* widget, void* v){std::cout << "MyWindow handleAddButtonClick" << std::endl;// update textint num = atoi(s_num_str.c_str());num++;s_num_str = std::to_string(num);std::cout << "add num to " << num << std::endl;s_input->static_value(s_num_str.c_str());s_input->redraw();}private:static Fl_Input* s_input;static std::string s_num_str;
};Fl_Input* MyWindow::s_input = nullptr;
std::string MyWindow::s_num_str = "0";#include <string>
#include <algorithm>int main(int argc, char** argv)
{MyWindow* my_window = new MyWindow(400, 300, "MyWindow");my_window->init();my_window->show();return Fl::run();
}
其中
- cmake配置里面需要增加编译选项,可以避免界面启动后弹出控制台黑框,如果作为debug阶段可以保留
- 控件绑定的回调函数必须是全局或者静态函数
效果
源码
https://download.csdn.net/download/u012234115/87878308