CMake创建wxWidgets桌面应用

CMake创建wxWidgets桌面应用

环境

  • Windows 10
  • CMake 3.28
  • MinGW 64 8.1
  • wxWidgets 3.2.4

wxWidgets

  • GitHub: https://github.com/wxWidgets/wxWidgets/
  • 文档地址: https://docs.wxwidgets.org/stable/page_topics.html
  • 下载地址:https://www.wxwidgets.org/downloads/
    • 点击下载按钮截图_17013379106103.png
    • 找到 MinGW-w64 8.1,下载头文件和库文件
      • 头文件
        • Header Files
      • 库文件(32/64位)
        • Development Files(开发时用)
        • Release DLLs(正式发布时用)
  • 这里样例中是直接引的官方做好的库,最合适你的环境的方式还是从源码构建库。使用源码构建时,操作很简单,直接build即可,不过需要注意官方Git仓库中还引了其他仓库,要记得一并下载,不然执行CMake时会报缺失文件的错。

项目结构

wx-demo   				# 项目目录
--|build			    # 工程构建目录,存临时生成的文件
--|--|...
--|include              # 头文件目录
--|--|...
--|src                  # 源文件目录
--|--|...
--|external             # 引入第三方库文件的所在的文件夹
--|--|wxWidgets
--|--|--|include        # wxWidgets头文件
--|--|--|lib            # wxWidgets库文件
--CMakeLists.txt		# CMake脚本文件
--main.cpp              # 程序入口

截图_17013397502684.png

  • Tips
    • 头文件库文件下载后,要解压,然后放到 ./external/wxWidgets 下(你也可以修改CMake配置),结构如上

项目代码

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(wx-demo 
      	VERSION 0.1
      	DESCRIPTION wxWidgets样例
      	LANGUAGES CXX
  			)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(EXTERNAL_DIR ${PROJECT_SOURCE_DIR}/external)

include_directories(./include)
include_directories(${EXTERNAL_DIR}/wxWidgets/include)

aux_source_directory(./src SRC)

add_executable(${PROJECT_NAME} main.cpp ${SRC})

# wxWidgets
# 配置wxWidgets库地址,用于find_package
set(wxWidgets_ROOT_DIR ${EXTERNAL_DIR}/wxWidgets)
set(wxWidgets_LIB_DIR ${EXTERNAL_DIR}/wxWidgets/lib/gcc810_x64_dll)

find_package(wxWidgets REQUIRED COMPONENTS net core base)
if(wxWidgets_USE_FILE)
    include(${wxWidgets_USE_FILE})
endif()

target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})
  • main.cpp
#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif


class MyFrame : public wxFrame {
public:
    explicit MyFrame(const wxString &title)
      : wxFrame(nullptr, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) {
        // 创建一个面板
        auto *panel = new wxPanel(this, wxID_ANY);

        // 创建一个按钮
        auto *button = new wxButton(panel, wxID_ANY, wxT("Click me!"),
                                    wxPoint(60, 40), wxSize(100, 30));

        // 绑定按钮点击事件
        button->Bind(wxEVT_BUTTON, &MyFrame::OnButtonClicked, this);
    }

private:
    void OnButtonClicked(wxCommandEvent &event) {
        wxUnusedVar(event);
        wxMessageBox(wxT("Hello, wxWidgets!"), wxT("Hello"), wxOK | wxICON_INFORMATION);
    }

wxDECLARE_EVENT_TABLE();
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_BUTTON(wxID_ANY, MyFrame::OnButtonClicked)
wxEND_EVENT_TABLE()

class MyApp : public wxApp
{
public:
    virtual bool OnInit() {
        auto *frame = new MyFrame(wxT("Hello wxWidgets!"));
        frame->Show(true);
        return true;
    }
};

wxIMPLEMENT_APP(MyApp); // NOLINT

CMake构建

  1. 进入项目根目录
  2. 生成构建文件$ cmake -G "MinGW Makefiles" -B build
  3. 构建$ cmake --build build
  4. 最后会在 ./build 目录下生成可执行文件 wx-demo.exe
  5. 界面样例如下

截图_17013386672629.png

  • Tips
    • 直接运行wx-demo.exe,会报找不到*.dll动态库的问题,可以暂时将wx-demo.exe放到 ./external/wxWidgets/lib/gcc810_x64_dll 下运行,也可以使用CMake命令拷贝库文件到exe程序旁

参考

  • https://docs.wxwidgets.org/stable/overview_install.html
  • Using CMake with your applications
  • 【wxWidgets 教程】安装、配置、HelloWorld篇(一)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版Edge(120) 侧边栏copilot消失解决办法

edge浏览器自动更新了,更新后侧边栏的copilot(以前的New Bing)图标没了查了网上的各种方法,说的比较多的是安装Edge Dev, 改地址等等,都比较麻烦,再装一个Edge也是不爽。终于在B站的评论里看到一个贼方便的…

python【matplotlib】鼠标拖动滚动缩放坐标范围和拖动图例共存

背景 根据前面的博文: python【matplotlib】画图鼠标缩放拖动动态改变坐标轴范围 和Python【Matplotlib】图例可拖动改变位置 两个博文,博主考虑了一下,如何将两者的功能结合起来,让二者共存。 只需根据Python【Matplotlib】鼠标…

代码随想录-刷题第二十八天

93. 复原 IP 地址 题目链接:93. 复原 IP 地址 思路:切割问题,原理上还是抽象成树形结构,然后使用回溯法。 131 题的要求是:让你把字符串 s 切分成若干个合法的回文串,返回所有的切分方法。 本题的要求是…

iOS_给View的部分区域截图 snapshot for view

文章目录 1.将整个view截图返回image:2.截取view的部分区域,返回image:3.旧方法:4.Tips参考: 1.将整个view截图返回image: 这些 api 已被废弃,所以需要判断 iOS 版本 写两套代码: R…

vue中实现PDF文件流预览

代码示例 <template><div class"print"><div v-if"!viewShow" class"opt-box"><div style"height: 700px; overflow: auto;"><el-table :data"tableData" border><el-table-column prop…

2019年第八届数学建模国际赛小美赛A题放射性产生的热量解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 A题 放射性产生的热量 原题再现&#xff1a; 假设我们把一块半衰期很长的放射性物质做成一个特定的形状。在这种材料中&#xff0c;原子核在衰变时会以随机的方向释放质子。我们假设携带质子的能量是一个常数。质子在穿过致密物质时&#x…

详谈前端中常用的加/密算法

本文主要详细介绍了在前端开发中常用的加/解密算法&#xff0c;以及前端如何实现。 总的来说&#xff1a;前端加密无论使用哪个加密都一样是有可能性被他人获取到相关的公钥或密钥的&#xff08;比如&#xff1a;拦截请求、查看源代码等&#xff09;&#xff0c;然后进行加密与…

深入理解网络 I/O:单 Selector 多线程|单线程模型

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

VG3225EFN压控晶体振荡器(VCXO)

5G脞2020年开始&#xff0c;商业服务正在全球范围内快速部署。5G通信网络需要保持高速率和可靠性&#xff0c;这2两者都需要低噪声&#xff0c;使用高频基模晶体振荡器&#xff08;高达50MHz&#xff09;&#xff0c;该晶体振荡器可以提供低相位噪声参考时钟&#xff0c;从而降…

轻松制作健身预约小程序

如果你想制作一个健身预约小程序&#xff0c;实现高效预约与健身管理&#xff0c;可以按照以下步骤进行操作。 第一步&#xff1a;注册登录乔拓云平台&#xff0c;进入后台 第二步&#xff1a;点击【轻应用小程序】&#xff0c;进入设计小程序页面。 第三步&#xff1a;在设计小…

拼多多买家页面批量导出订单excel

拼多多买家页面批量导出订单excel 由于拼多多不支持订单导出excel清算起来很麻烦&#xff0c;就自己写了一个页面批量导出脚本代码。 首先打开拼多多手机端网站&#xff1a;https://mobile.pinduoduo.com/ 登录后点击我的订单打开f12审查元素 在控制台引入jquery&#xff0c;引…

Git中stash的使用

Git中stash的使用 stash命令1. stash保存当前修改2. 重新使用缓存3. 查看stash3. 删除 使用场景 stash命令 1. stash保存当前修改 git stash 会把所有未提交的修改&#xff08;包括暂存的和非暂存的&#xff09;都保存起来. git stashgit stash save 注释2. 重新使用缓存 #…

k8s中pod监控数据在grafana中展示

实现目标:将kubesphere[K8S]中运行的pod监控数据在grafana平台进行展示。 前提说明:需要在k8s每个集群中内置的prometheus配置中将pod指标数据远程写入到victoriametrics持久化数据库中。 实现效果如下: CPU使用量: round(sum by (namespace, pod) (irate(container_cpu…

YOLOv8改进 | Conv篇 | 轻量级下采样方法ContextGuided(涨点幅度)

一、本文介绍 本文给大家带来的是改进机制是一种替换Conv的模块Context Guided Block (CG block) &#xff0c;其是在CGNet论文中提出的一种模块&#xff0c;其基本原理是模拟人类视觉系统依赖上下文信息来理解场景。CG block 用于捕获局部特征、周围上下文和全局上下文&#…

【Qt问题记录】使用QDebug类输出不带转义或双引号

问题 使用Qt进行编程时&#xff0c;需要借助输出信息验证编码的正确性。 默认情况下&#xff0c;如果输出的是字符串&#xff0c;qDebug() 会在字符串的两侧加上引号&#xff0c;有时还会转义。 如下所示&#xff1a; QString strInfo QStringLiteral("helloworld"…

宏基因组学及宏转录组学分析工具MOCAT2(Meta‘omic Analysis Toolkit 2)安装配置及常用使用方法

详细介绍 尽管这个工具已经暂停后续开发&#xff0c;但其工具功能还是挺好的&#xff0c;大家可以参考一下&#xff0c;尤其对于喜欢自定义开发流程的可以参考是流程。 MOCAT 2&#xff08;Metaomic Analysis Toolkit 2&#xff09;是一个用于宏基因组和宏转录组数据分析的工具…

怎么选择合适的3ds Max云渲染农场?

3ds Max 用户日常面临的一个共同挑战便是漫长的渲染周期。作为一个强大的三维建模和渲染软件&#xff0c;3ds Max 势必需处理大量的光照、材质和阴影计算任务&#xff0c;因此&#xff0c;良好的渲染方案对从业者而言尤为重口。 一、为何考虑3ds Max云渲染? 云渲染成为了解决…

小白学爬虫:根据商品ID或商品链接获取淘宝商品详情数据接口方法

小白学爬虫的准备工作包括以下几个方面&#xff1a; 学习Python基础知识&#xff1a;首先需要掌握Python编程语言的基本语法和数据类型&#xff0c;了解Python的常用库和模块&#xff0c;例如requests库等。了解HTTP协议和HTML语言&#xff1a;了解HTTP协议的基本概念和原理&a…

Tekton 克隆 git 仓库

Tekton 克隆 git仓库 介绍如何使用 Tektonhub 官方 git-clone task 克隆 github 上的源码到本地。 git-clone task yaml文件下载地址&#xff1a;https://hub.tekton.dev/tekton/task/git-clone 查看git-clone task yaml内容&#xff1a; 点击Install&#xff0c;选择一种…

innerHTML、innerText、textContent有什么区别

innerHTML、innerText、textContent有什么区别 在 HTML 中&#xff0c;innerHTML、innerText、 和textContent是 DOM&#xff08;文档对象模型&#xff09;的属性。它们允许我们读取和更新 HTML 元素的内容。 但它们在包含的内容以及处理 HTML 标签的方式有不同的行为。 读完…