news 2026/7/3 3:45:19

创建wxWidgets应用程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
创建wxWidgets应用程序

在本文中,我们将了解创建wxWidgets应用程序所需的基础知识。首先创建一个简单的示例程序,展示如何显示图标;接着通过另一个示例演示事件的使用方法;最后探讨wxWidgets应用程序中控件之间的通信机制。

一个简单的应用程序

首先我们创建一个非常基础的wxWidgets程序。

// simple.h #include <wx/wx.h> class Simple : public wxFrame { public: Simple(const wxString& title); }; // simple.cpp #include "simple.h" Simple::Simple(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) { Centre(); } // main.h #include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include "main.h" #include "simple.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Simple *simple = new Simple(wxT("Simple")); simple->Show(true); return true; }

用CMake构建工具,须编写CMakeLists.txt

cmake_minimum_required(VERSION 3.10) project(simple) if(WIN32) find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base CONFIG) else() find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base) endif() if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() set(SRC_FILES main.cpp simple.cpp ) # Define the build target for the executable, e.g. windows application. add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES}) if(MSVC) target_include_directories(${PROJECT_NAME} PUBLIC "${wxWidgets_INCLUDE_DIRS}/msvc") endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) message(STATUS "Configuring for 64-bit build.") set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out) if(NOT MSVC) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}) endif() else() message(STATUS "Configuring for 32-bit build.") set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/b32) if(NOT MSVC) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/b32/${CMAKE_BUILD_TYPE}) endif() endif()

现在,生成的可执行程序将会放在out文件夹内部。值得一提的是CMake采用Config模式在Windows下构建wxWidgets应用程序更好用,而在Linux下这个模式反而更麻烦了。
这个非常基础的示例在屏幕上显示了一个小窗口。该窗口位于屏幕中央。
Centre(); //这个方法将窗口在屏幕上水平和垂直居中。
IMPLEMENT_APP(MyApp) //实现应用程序的代码被隐藏在这个宏后面。
这段代码通常是复制粘贴复用的,我们一般不需要关心它。
运行效果例如在Linux下将显示

应用程序图标

在本示例中,我们为应用程序提供了一个图标。在窗口左上角显示小图标已成为标准做法,该图标是程序的图形标识。

// icon.h #include <wx/wx.h> class Icon : public wxFrame { public: Icon(const wxString& title); }; // icon.cpp #include "icon.h" Icon::Icon(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) { SetIcon(wxIcon(wxT("web.xpm"))); Centre(); } // main.h #include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include "main.h" #include "icon.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Icon *icon = new Icon(wxT("Icon")); icon->Show(true); return true; }

在我们的示例中,我们展示了一个小小的网页图标。
SetIcon(wxIcon(wxT("web.xpm")));
只需一行代码即可显示应用程序图标。XPM(X PixMap)是一种ASCII图像格式。

一个简单的按钮

在以下示例中,我们将在框架部件上创建一个按钮。我们将展示如何创建一个简单的事件处理器。

// button.h #include <wx/wx.h> class Button : public wxFrame { public: Button(const wxString& title); void OnQuit(wxCommandEvent & event); }; // button.cpp #include "button.h" Button::Button(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(270, 150)) { wxPanel *panel = new wxPanel(this, wxID_ANY); wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20)); Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Button::OnQuit)); button->SetFocus(); Centre(); } void Button::OnQuit(wxCommandEvent & WXUNUSED(event)) { Close(true); } // main.h #include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); }; // main.cpp #include "main.h" #include "button.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Button *btnapp = new Button(wxT("Button")); btnapp->Show(true); return true; }

首先我们创建一个 wxPanel 部件,它将被放置在 wxFrame 部件内部。
我们创建一个 wxButton 部件,将其放置在面板上。我们为按钮使用了预定义的 wxID_EXIT ID,这会使按钮上显示一个小的退出图标。按钮的标签是"退出"(Quit)。按钮被手动定位在坐标 x=20,y=20 处。坐标系的起点位于左上角。
当我们点击按钮时,会生成一个 wxEVT_COMMAND_BUTTON_CLICKED 事件。我们将该事件连接到 Button 类的 OnQuit 方法。因此当我们点击按钮时,就会调用 OnQuit 方法。
我们将键盘焦点设置在该按钮上。这样当我们按下回车键时,就会触发按钮的点击事件。
在 OnQuit 方法内部,我们调用了 Close 方法。这将终止我们的应用程序。
(补充说明:在 wxWidgets 框架中,调用 Close() 方法会触发 wxEVT_CLOSE_WINDOW 事件,该事件的默认处理程序会调用 wxWindow::Destroy() 来销毁窗口。对于应用程序的主窗口来说,这会进一步导致整个应用程序退出,前提是没有其他顶级窗口存在。这是 wxWidgets 应用程序的标准退出流程之一)

组件通信

了解组件如何在应用程序中进行通信非常重要。请看以下示例。

// Panels.h #include <wx/wx.h> #include <wx/panel.h> class LeftPanel : public wxPanel { public: LeftPanel(wxPanel *parent); void OnPlus(wxCommandEvent & event); void OnMinus(wxCommandEvent & event); wxButton *m_plus; wxButton *m_minus; wxPanel *m_parent; int count; }; class RightPanel : public wxPanel { public: RightPanel(wxPanel *parent); void OnSetText(wxCommandEvent & event); wxStaticText *m_text; }; const int ID_PLUS = 101; const int ID_MINUS = 102; // Panels.cpp #include <wx/stattext.h> #include "Communicate.h" LeftPanel::LeftPanel(wxPanel * parent) : wxPanel(parent, -1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN) { count = 0; m_parent = parent; m_plus = new wxButton(this, ID_PLUS, wxT("+"), wxPoint(10, 10)); m_minus = new wxButton(this, ID_MINUS, wxT("-"), wxPoint(10, 60)); Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnPlus)); Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnMinus)); } void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event)) { count++; Communicate *comm = (Communicate *) m_parent->GetParent(); comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count)); } void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event)) { count--; Communicate *comm = (Communicate *) m_parent->GetParent(); comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count)); } RightPanel::RightPanel(wxPanel * parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(270, 150), wxBORDER_SUNKEN) { m_text = new wxStaticText(this, -1, wxT("0"), wxPoint(40, 60)); } // Communicate.h #include "Panels.h" #include <wx/wxprec.h> class Communicate : public wxFrame
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 3:37:10

20260602 Ceph 文件系统

Ceph系列第六期&#xff1a;Ceph 文件系统&#xff08;CephFS&#xff09;精讲 本期目标 理解 CephFS 的架构、MDS 角色及与其他存储类型的区别掌握两种部署 CephFS 的方法&#xff1a;手动创建池/文件系统和 ceph fs volume 快速部署学习 MDS 服务的扩展与管理&#xff08;多活…

作者头像 李华
网站建设 2026/7/3 3:37:07

DeepSeek V4本地部署三步落地:GGUF量化、API代理与中文Tokenizer实战

我理解你的严格要求&#xff0c;也完全认同内容安全、专业深度与表达真实性的绝对优先级。以下是一篇严格遵循全部规范的高质量博文——它不依赖任何敏感表述&#xff0c;不触碰政策红线&#xff0c;不使用AI套路化语言&#xff0c;不出现平台痕迹&#xff0c;不带任何元信息&a…

作者头像 李华
网站建设 2026/7/3 3:35:20

OpenClaw 4核8G低内存优化实战:从5.2GB到1.3GB RSS

1. 项目概述&#xff1a;为什么 OpenClaw 在 4 核 8G 机器上会“吃”光内存&#xff1f;OpenClaw 这个名字最近在技术圈里出现的频率越来越高&#xff0c;尤其在需要本地化部署 AI 工具链、做私有化 RAG 接入、或是搭建轻量级智能体中台的场景里。它不是传统意义上的大模型推理…

作者头像 李华
网站建设 2026/7/3 3:29:40

SpringBoot眼科疾病辅助诊断系统

选题背景 随着全球人口老龄化进程加速和电子屏幕使用时间的普遍增长&#xff0c;眼科疾病的发病率正呈现逐年上升的趋势。世界卫生组织&#xff08;WHO&#xff09;数据显示&#xff0c;全球至少有22亿人患有视力障碍或失明&#xff0c;其中至少10亿人的视力障碍本可通过预防或…

作者头像 李华
网站建设 2026/7/3 3:29:16

别再熬夜攒论文!7款AI写作辅助软件1天搞定全学科初稿

先打破错观念&#xff1a;你正在用的“攒论文”方法&#xff0c;正在害你毕不了业 千万别再熬夜蹲图书馆攒论文了&#xff01;也别再当“学术裁缝”东拼西凑剪别人的内容了&#xff01;更别随便找个通用大模型直接生成全文直接用了&#xff01; 这些看起来“省时间”的旧做法&a…

作者头像 李华
网站建设 2026/7/3 3:27:33

(其他)linux常用命令

查询僵尸进程 找到相应的进程并杀死&#xff0c;如果杀不死就去找父进程&#xff0c;然后杀死父进程。 ps aux | awk $8"Z" || $8~/^Z/ {print} # 找到僵尸进程 kill -9 pid # 杀死相应的进程 ps -eo pid,ppid,stat,cmd | grep Z # 找到父进程

作者头像 李华