C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和retained 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}
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;
// 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