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 SRC
    src/*.h
    src/*.cpp
add_executable(${PROJECT_NAME} ${SRC})
# both win and linux use the same lib name
target_link_libraries(${PROJECT_NAME}

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;
		// ui
		begin();
		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 text
		y += 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 text
		int 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

C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和retained mode。以下是一个使用FLTK开发的简单demo代码示例,功能是显示一个编辑框和一个按钮,点击按钮刷新编辑框的数字。但如果在开发小工具项目,要求跨平台、开源免费、协议友好、性能高、轻量级的需求,这里推荐FLTK库(使用这些框架都支持构建在windows、mac、linux上面能运行的桌面图形界面程序。),只需要作为一个依赖库的方式引入工程即可。
fltk-rsFLTK 图形用户界面的 Rust 绑定。FLTK crate 是一个跨平台轻量级 gui ,可以静态链接以生成小型、自包含和快速的 gui 应用程序。教程:视频书面Erco 的 FLTK 秘籍页面,这是一个优秀的 FLTK C++ 参考。为什么选择FLTK?轻的。小二进制文件,剥离后大约 1mb。内存占用小。速度。快速安装、快速构建、快速启动和快速运行。单个可执行文件。无需部署 DLL。支持旧架构。FLTK 的许可协议允许对闭源应用程序进行静态链接。主题性(支持 4 个主题:Base、GTK、Plastic 和 Gleam)。提供大约 80 个可定制的小部件。具有内置的图像支持。这是使用 FLTK 的软件列表。链接到官方 FLTK 存储。官方文档的链接。用法只需将以下内容添加到您项目的 Cargo.toml 文件中:[dependencies ]fltk =" ^0.15"要使用 repo 中的最新更改:[dependencies ]fltk = {version =" ^0.15" ,git =" https://github.com/MoAlyousef/f
Qt是一个跨平台应用和用户界面开发框架,它包括一个跨平台、集成开发工具和跨平台IDE。通过使用Qt,你可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。 2.  Fltk  FLTK板条箱是一个跨平台轻量级gui,可以静态链接以生成小型,自包含且快速的gui应用程序。 Erco的FLTK作弊,这是出色的FLTK C ++参考。 为什么选择FLTK? 轻的。 小二进制文件,剥离后大约1mb。 。 速度。 快速安装,快速构建,快速启动和快速运行。 单个可执行文件。 没有要部署的DLL。 支持旧架构。 FLTK的许可许可,允许对封闭源应用程序进行静态链接。 Themability(4个受支持的主题:Base,GTK,Plastic和Gleam)。 提供约80个可定制的小部件。 具有内置的图像支持。 这是使用FLTK的软件的。 到官方FLTK存储。 到官方文档。 只需将以下内容添加到项目的Cargo.toml文件中: [ dependencies ]
什么?你还不知道C++能快速开发部署GUI?... 什么?你不知道Qt是什么... 这篇文章,教你怎么用Qt Creator2.0来做一个GUI。下载地址什么的不罗嗦,google之。我这里给出的,是每个QT GUI 工程用QT creator来做时的流程。 假设你已经安装好了qt sdk。 1.文件-&gt;新建工程或文件。 2.选择Qt控件项目-&gt;QT GUI应用。 3.取消...
FLTK(Fast Light Toolkit)是一个跨平台C++GUI工具集,用在UNIX/Linux(X11)、微软Windows和Mac OS X上。FLTK提供现代的GUI功能,除却膨胀,通过OpenGL和内建的GLUT模拟器提供3D图形支持。最初由Bill Spitzak开发,当前由全世界一小组开发使用美国一个中心仓维护。 FLTK具有体积小、速度快和良好移植性等优点。 FLTK当前的稳定版(1.3.5)采用LGPL发布,意味着可以通过类引用的方式(前提是不对FLTK本身代码进行