C++轻量级跨平台桌面GUI库FLTK的简单使用

news2024/11/28 14:11:31

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#常见技能_数组

前几天一个学员在学习C#与数组交互时,也不知道数组可以用来做什么 。下面我们就详细讲讲C# 和数组交互的相关知识。 在C#编程中&#xff0c;数组是一种非常重要的数据结构&#xff0c;它可以存储多个相同类型的数据&#xff0c;并且使用索引来访问这些数据。在实际应用中&…

5.2.7 因特网控制报文协议ICMP

5.2.7 因特网控制报文协议ICMP 我们知道因特网的技术核心是IP数据报&#xff0c;IP数据报的最大特点是无连接不可靠&#xff0c;但实际中因特网中也会存在通信线路或者是处理器的故障、路由器拥塞等等使得无法接收或者处理数据报&#xff0c;路由表也误导导致出现路由环路等原…

微软MFC技术运行机制

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下微软MFC技术运行机制。 很多初学者误以为VC开发必须使用MFC&#xff0c;其实不一定的。MFC的使用只能是提高程序在某些情况下的开发效率&#xff0c;而不能替代整个Win32程序设计。我认为我们有…

python grpc使用示例

1. grpc简介 1.1 概述 gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中&#xff0c;客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法&#xff0c;就像它是本地对象一样&#xff0c;可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样&#xff0c;gR…

AI绘画MidJourney 酷炫艺术风格效果,总有一款你喜欢

文 / 高扬 今天六一儿童节&#xff0c;祝各位大朋友节日快乐。 这次以儿童为主题&#xff0c;看看MidJourney的绘画风格&#xff0c;在这里&#xff0c;我使用的默认V5.1版本。 图画场景是一个男孩和一个女孩在田野玩耍&#xff0c;对应的英文是&#xff1a;A boy and a girl a…

使用PyQT实现模拟表盘时钟的显示效果

代码 class clockThread(QThread):update_ui_signal pyqtSignal(str)def __init__(self, window):super(clockThread, self).__init__()# 信号绑定槽函数self.update_ui_signal.connect(self.draw_time)self.hour 0self.minute 0self.second 0self.window windowself.win…

数据结构与算法·第6章【树】

基本操作 树的相关定义 树的深度&#xff08;高度&#xff09;&#xff1a;树中叶子结点所在的最大层次 森林&#xff1a; m m m棵互不相交的树的集合 二叉树 二叉树或为空树&#xff0c;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。 性质 二…

JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各…

企业邮箱如何设置邮件审核

有的时候对外给客户或合作伙伴等发送邮件需要领导审核后再发&#xff0c;以前都是先发给领导&#xff0c;领导审核以后再重新发给客户&#xff0c; 这样的流程太过繁琐。 新的邮件审核功能既能满足审核需求&#xff0c;又避免了重复发信&#xff0c;可以极大提高工作效率。 设…

使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub

Vue3TSVite开发组件库并发布到npm 网站在线预览&#xff1a; Vue Amazing UI | Amazing UI Components LibraryAmazing UI 组件库https://themusecatcher.github.io/vue-amazing-ui/参考文档&#xff1a; VitePress 目录 一、安装依赖及配置 1、安装 vitepress 2、在 p…

想要精通算法和SQL的成长之路 - 反转链表

想要精通算法和SQL的成长之路 - 反转链表 前言一. 反转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 反转链表 原题链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路如下&#xff1a; 我们可以通过一次遍历&#xff…

该怎么用设计测试用例测网上银行转账?

目录 前言 1、网上银行转账是怎么测的&#xff0c;设计一下测试用例。 回答思路&#xff1a; 2、测试工作的流程?缺陷状态有什么?设计测试用例有几种方法&#xff1f; 修改完以后&#xff0c;有两种处理情况&#xff1a; 3、在项目中找到的经典BUG是什么&#xff1f; 4、定期…

kali系统渗透

用kali远程ssh时&#xff0c;如果不能的话 按照以下方法 ┌──(root㉿kali)-[~]└─# mkdir ~/.ssh┌──(root㉿kali)-[~]└─# vim ~/.ssh/configHost *HostkeyAlgorithms ssh-rsaPubkeyAcceptedKeyTypes ssh-rsa msfconlole -q //进入马上发不显示内容&#xff0c;所以加…

编程实现人脸识别

1.更改url 用翔云平台下的人脸识别的API文档 把他贴到url中&#xff1a; 2.定义参数 &#xff08;根据平台给定的这些串口接收参数来定义&#xff09; key和secret在这里找&#xff1a; 3.指定post内容 把这部分定义成一个postString 4.字符串的拼接 sprintf函数调用的主…

使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码)

目录 一、原理部分 二、代码详解部分 三、结果及分析 一、原理部分 PSO算法由美国学者于 1995 年提出&#xff0c;因其算法简单、效果良好&#xff0c;而在很多领域得到了广泛应用。该算法的起源是模拟鸟群的觅食过程&#xff0c;形成一种群体智能搜索算法。 其核心是&#…

使用Flask高效构建Web应用

1、聊聊Flask框架 Flask官方文档 Flask是Armin ronacher基于Python开发的微型Web框架&#xff0c;诞生于2010年&#xff0c;它依赖于jinja2模板和Werkzeug WSGI服务。Flask的核心简单易于扩展&#xff0c;它不会替你做出太多决策比如使用何种数据库或模板引擎&#xff0c;这些都…

抖音seo矩阵系统源码解析

抖音SEO矩阵系统源码是一种用于优化抖音视频内容的工具&#xff0c;可以帮助用户提高抖音视频的搜索排名和流量&#xff0c;从而增加视频曝光和转化率。该系统包括两部分&#xff0c;即数据收集和分析模块以及SEO策略和实施模块。 数据收集和分析模块主要负责从抖音平台上收集…

认识功能安全

01、什么是功能安全 1-背景简介 由于汽车的复杂性&#xff0c;整个行业正在致力于提供符合安全要求的零部件系统。比如&#xff0c;线控油门系统&#xff0c;当驾驶员踩下油门踏板&#xff0c;踏板上的传感器向控制器发送信号时&#xff0c;控制器会综合分析如发动机转速、车…

ERP系统实施,8个需要了解的关键绩效指标

实施ERP系统是一项复杂的、耗时的工作&#xff0c;但它也代表了企业重新思考其战略、目标和流程的绝佳机会。成功的ERP实施可以激发创新&#xff0c;改善企业的所有领域。例如&#xff0c;通过集中企业各部门不断增长的财务和业务数据&#xff0c;所有的决策者都在同一个页面上…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术&#xff0c;非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况&#xff0c;及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…