【wxWidgets 教程】安装、配置、HelloWorld篇(一)

一、下载 wxWidgets 源码

下载地址:https://github.com/wxWidgets/wxWidgets.git
这里,我下载了 wxWidgets 3.2.2.1,接下来便以这个版本为示例进行详细的安装介绍。

二、编译配置

在进行源码编译前,要确保已经安装了 CMake。CMake 的下载路径:https://cmake.org/download/
下面是一段简单的构建 wxWidgets 库的 CMake 脚本:

include(FetchContent)
FetchContent_Declare(
  wxWidgets
  GIT_REPOSITORY "https://github.com/wxWidgets/wxWidgets.git"
  GIT_TAG v3.2.2.1
)
FetchContent_MakeAvailable(wxWidgets)

它会从 GitHub 上把 wxWidgets 源码下载下来。执行 CMake 脚本,等待一段时间,可看到有以下输出:

-- Which libraries should wxWidgets use?
    wxUSE_STL:      OFF      (use C++ STL classes)
    wxUSE_REGEX:    builtin  (enable support for wxRegEx class)
    wxUSE_ZLIB:     builtin  (use zlib for LZW compression)
    wxUSE_EXPAT:    builtin  (use expat for XML parsing)
    wxUSE_LIBJPEG:  builtin  (use libjpeg (JPEG file format))
    wxUSE_LIBPNG:   builtin  (use libpng (PNG image format))
    wxUSE_LIBTIFF:  builtin  (use libtiff (TIFF file format))
    wxUSE_NANOSVG:  builtin  (use NanoSVG for rasterizing SVG)
    wxUSE_LIBLZMA:  OFF      (use liblzma for LZMA compression)

-- Configured wxWidgets 3.2.2 for Windows-10.0.22000
    Min OS Version required at runtime:                Windows Vista / Windows Server 2008 (x64 Edition)
    Which GUI toolkit should wxWidgets use?            msw  
    Should wxWidgets be compiled into single library?  OFF
    Should wxWidgets be linked as a shared library?    ON
    Should wxWidgets support Unicode?                  ON
    What wxWidgets compatibility level should be used? 3.0

这里专门对两个为 “OFF” 的选项进行解析:

  1. wxUSE_STL 是一个在 wxWidgets 库的C++代码中用于启用或禁用标准模板库 (STL) 的宏定义。它控制库中使用STL的部分,例如使用 std::string 替代 wxString。当 wxUSE_STL 被定义为 “ON” 时,表示启用 STL 支持,而当它被定义为 0 时,则表示禁用 STL 支持。设置 wxUSE_STL 的值将会影响 wxWidgets 库的构建和使用方式。启用 STL 支持将允许开发人员更容易地使用C++标准库中的一些数据结构和算法,从而简化代码的编写过程。禁用 STL 支持可以减少库的大小,并提高代码的性能,因为STL的实现可能会导致一些额外的开销。
  2. wxUSE_LIBLZMA 用于启用或禁用 wxWidgetsliblzma 库的支持。liblzma 是一个用于数据压缩和解压缩的库,支持多种压缩格式,包括 XZLZMA。当需要使用 wxWidgets 中与 liblzma 相关的功能时,例如通过 wxArchiveClass 类解压缩 XZ 格式的归档文件,需要确保 wxUSE_LIBLZMA 设置为 “ON”,并确保已安装liblzma 库及其头文件。

其他选项默认都是 builtin,即已内建到了 wxWidgets 中,我们可以不用管。

继续往下看,我们可以看到这段输出:

Which GUI toolkit should wxWidgets use?            msw  

这说明我目前所用的是 wxMSW 端口,它会自动识别我们的系统并作出选择。当然,如果我们想自己设置其他平台端口,可以设置 CMake 脚本的 wxBUILD_TOOLKIT 变量值,如果要知道当前系统上 wxWidgets 可用的GUI工具集,可查看 wxTOOLKIT_OPTIONS 的变量值,另外,wxPLATFORM 变量记录了当前的操作系统平台是什么。我这里 wxPLATFORM 的值为 WIN32

还有这句输出:

Should wxWidgets be compiled into single library?  OFF

默认情况下,wxWidgets 编译输出的是多个库文件,如果想编译成一个库文件,可更改选项 wxBUILD_MONOLITHIC 为 “ON”,然后重新构建 CMake 项目。

接下来,我们写一个最简单的 wxWidgets 项目。先写好 CMake 脚本。

cmake_minimum_required(VERSION 3.24)
project(wxWidget_test1)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY bin)

include(cmake/Find_wxWidget.cmake)
add_executable(wxWidget_test1 main.cpp)
target_link_libraries(wxWidget_test1 PRIVATE
                      # wxmono
                      wx::net wx::core wx::base)

# Windows下,在构建完成后,将依赖的动态链接库文件拷贝到可执行文件输出目录下
add_custom_command(TARGET wxWidget_test1
                   POST_BUILD COMMAND "${CMAKE_COMMAND}" -E
                   copy_if_different "$<TARGET_RUNTIME_DLLS:wxWidget_test1>" "$<TARGET_FILE_DIR:wxWidget_test1>"
                   VERBATIM COMMAND_EXPAND_LISTS)

# Windows下,需添加以下属性,否则编译时会出现main函数未定义的错误
set_target_properties(wxWidget_test1 PROPERTIES WIN32_EXECUTABLE ON)

上述脚本中,我把构建 wxWidgets 库的脚本指令放到了项目根目录的“cmake”目录的 Find_wxWidget.cmake 中(即本文开头的第一段 CMake 脚本)。
这个项目使用 wxWidgetswx::net wx::core wx::base 三个模块,当然这是把 wxWidgets 编译成多个库文件的情况下的使用方法。
如果编译成一个库文件(即 wxBUILD_MONOLITHICON)则应该在 target_link_libraries 中添加 wxmono(脚本中我把这行给注释了),且不能独立包含模块,此时的 target_link_libraries 应该写成:

target_link_libraries(wxWidget_test1 PRIVATE wxmono)

三、代码编写

#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

代码解释:

  1. 首先,我们需要包含 wxWidgets 的头文件
  2. 接下来,我们需要创建一个 wxFrame 派生类来实现我们的主窗口。在 MyFrame 类中,我们需要创建主窗口的各种控件和布局,并处理它们的事件
  3. 我们需要创建一个 wxWidgets 应用程序类,该类派生自 wxApp 类。在此类中,我们需要实现 OnInit() 函数,该函数将在应用程序启动时被调用。在 OnInit() 函数中,我们需要创建主窗口
  4. 最后,使用 wxIMPLEMENT_APP 宏指定我们的应用程序类

编译后运行结果如下:
程序运行结果

至此,一个最基本的 wxWidgets 库的安装配置和使用方法介绍结束。

四、CMake说明

CMake 构建指令

cmake .

cmake 后面接的要是根 CMakeLists.txt 文件的路径,执行后将会把当前目录作为构建目录. 意味着根源码目录作为构建目录

CMake 编译指令

cmake --build .

注意,此时的 . 指的是构建目录所在路径,要与 CMake 构建时的指令区分开来。


【wxWidgets 教程】安装、配置、HelloWorld篇(一) 至此完毕,欢迎大家指正!还请大家点点赞,给我点动力~~

下一篇:【wxWidgets 教程】HelloWorld 程序详细介绍(二)

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao_Ley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值