wxWidgets常见辅助类的应用示例

wxWidgets提供了一系列功能强大的辅助类(Helper Classes),涵盖了字符串处理、文件操作、XML解析、数据流、数据库和网络通信等功能,这些类为跨平台GUI开发提供了基础工具支持,帮助开发者完成各种任务。

wxWidgets库可用于创建控制台和图形界面(GUI)应用程序。本文将通过一些控制台应用程序的示例,阐述部分核心辅助类的使用方法。

Console示例

好,那现在让我们跟着ZetCode教程上的示例。第一个非常简单的控制台程序

一个非常简单的控制台程序:

// console.cpp
#include <wx/wx.h> // 必须得加上这个头文件
#include <wx/string.h> int main(int argc, char **argv)
{
wxPuts(wxT("A wxWidgets console application"));
}

对应的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(console) find_package(wxWidgets REQUIRED COMPONENTS core)
include(${wxWidgets_USE_FILE}) add_executable(${PROJECT_NAME} console.cpp)
target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})

然后因为现在是VS Code开发,所以需要改一个调试配置文件launch.json,找到

"program": "${workspaceFolder}/hello",
更改为
"program": "${workspaceFolder}/console",
现在你应该能顺利构建编译运行,这将在控制台终端输出
A wxWidgets console application
好的,现在我们将console.cpp和CMakeLists.txt文件复制到Windows平台,是的,我们的目的是要跨平台的,现在我们来做这件事。
在Windows上找到一个工作空间(注意路径字符规范),还是创建test文件夹,把要复制的两个文件拷贝到里面。
进入cmd命令行,还是将构建文件放到build下。
cmake -B build

然后生成可执行文件大概会出错,需修改CMakeLists.txt文件(确保跨平台):

cmake_minimum_required(VERSION 3.10)
project(console) if(WIN32)
find_package(wxWidgets 3.2.4 REQUIRED COMPONENTS core base adv html xml net aui stc xrc gl media qa richtext propgrid ribbon webview)
else()
find_package(wxWidgets 3.2.4 REQUIRED COMPONENTS core base)
endif() include(${wxWidgets_USE_FILE})
add_executable(${PROJECT_NAME} console.cpp)
target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES}) if(MSVC)
target_include_directories(${PROJECT_NAME} PUBLIC "${wxWidgets_INCLUDE_DIRS}/msvc")
endif() set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})

现在可以构建并生成可执行文件了,在cmd中键入

cmake --build ./build

这会根据默认构建系统在build文件夹里生成程序。如果你安装了Visual Studio则默认使用msvc工具链,你将会在build下看到一个sln解决方案,你也可以打开解决方案在IDE下生成可执行程序。

wxString类示例

wxString是一个表示字符串的类。在下面的示例中,我们定义了三个wxString对象。我们通过加法运算将这些字符串组合成一个新的字符串。

字符串连接

// addition.cpp
#include <wx/wx.h>
#include <wx/string.h> int main(int argc, char **argv)
{
wxString str1 = wxT("Linux");
wxString str2 = wxT("Operating");
wxString str3 = wxT("System");
wxString str = str1 + wxT(" ") + str2 + wxT(" ") + str3;
wxPuts(str);
}

输出:

Linux Operating System

你可以练习使用CMake生成这个可执行程序,当然你可以在Linux终端使用

g++ addition.cpp `wx-config --cxxflags --libs` -o addition

更简洁地生成可执行文件。

字符串格式化

// formatted.cpp
#include <wx/wx.h>
#include <wx/string.h> int main(int argc, char **argv)
{
int flowers = 21;
wxString str;
str.Printf(wxT("There are %d red roses."), flowers);
wxPuts(str);
}

输出:

There are 21 red roses.

以下示例演示了如何检查一个字符串是否包含另一个字符串,为此我们使用了Contains方法。(注:根据编程语言或框架的不同,类似功能可能有不同命名,如includes()、find()、contains()等,但作用相同。)

字符串包含检查

// contains.cpp
#include <wx/wx.h>
#include <wx/string.h> int main(int argc, char **argv)
{
wxString str = wxT("The history of my life");
if (str.Contains(wxT("history"))) {
wxPuts(wxT("Contains!"));
}
if (!str.Contains(wxT("plain"))) {
wxPuts(wxT("Does not contain!"));
}
}

输出:

Contains!
Does not contain!

Len方法返回字符串中的字符数。(补充说明:对于多字节字符(如中文),不同语言处理方式可能不同,有些按字符数统计,有些按字节数统计)

字符串长度

// length.cpp
#include <wx/wx.h>
#include <wx/string.h> int main(int argc, char **argv)
{
wxString str = wxT("The history of my life");
wxPrintf(wxT("The string has %d characters\n"), str.Len());
}

输出:

The string has 22 characters

大小写转换

// cases.cpp
#include <wx/wx.h>
#include <wx/string.h> int main(int argc, char **argv)
{
wxString str = wxT("The history of my life");
wxPuts(str.MakeLower());
wxPuts(str.MakeUpper());
}

输出:

the history of my life
THE HISTORY OF MY LIFE

实用工具函数

(编程概念说明:这类函数通常指不依赖对象状态、独立完成特定任务的辅助函数)

wxWidgets 提供了多个实用的工具函数,用于执行进程、获取用户主目录或获取操作系统名称。

在以下示例中,我们执行了 ls 命令(仅限 Unix 系统),为此我们使用了 wxShell 函数。

执行shell命令

// shell.cpp
#include <wx/wx.h>
#include <wx/string.h>
#include <wx/utils.h> int main(int argc, char **argv)
{
wxShell(wxT("ls -l"));
}

这将输出当前路径下的文件统计信息。

接下来我们将获取用户主目录、操作系统名称、用户名、主机名以及内存空闲总量。

获取系统信息

// system.cpp
#include <wx/wx.h>
#include <wx/string.h>
#include <wx/utils.h> int main(int argc, char **argv)
{
wxPuts(wxGetHomeDir());
wxPuts(wxGetOsDescription());
wxPuts(wxGetUserName());
wxPuts(wxGetFullHostName());
long mem = wxGetFreeMemory().ToLong();
wxPrintf(wxT("Memory: %ld\n"), mem);
}

这将输出系统及用户等统计信息。

时间和日期处理

在wxWidgets中,我们提供了多个用于处理日期和时间的类。

该示例展示了以不同格式显示的当前日期或时间。

当前日期时间格式化

// datetime.cpp
#include <wx/wx.h>
#include <wx/datetime.h> int main(int argc, char **argv)
{
wxDateTime now = wxDateTime::Now();
wxString date1 = now.Format();
wxString date2 = now.Format(wxT("%X"));
wxString date3 = now.Format(wxT("%x"));
wxPuts(date1);
wxPuts(date2);
wxPuts(date3);
}

输出示例:

Wed Jun 11 16:18:09 2025
16:18:09
06/11/25

不同城市时间

// datetime2.cpp
#include <wx/wx.h>
#include <wx/datetime.h> int main(int argc, char **argv)
{
wxDateTime now = wxDateTime::Now();
wxPrintf(wxT(" Tokyo: %s\n"), now.Format(wxT("%a %T"), wxDateTime::GMT9).c_str());
wxPrintf(wxT(" Moscow: %s\n"), now.Format(wxT("%a %T"), wxDateTime::MSD).c_str());
wxPrintf(wxT("Budapest: %s\n"), now.Format(wxT("%a %T"), wxDateTime::CEST).c_str());
wxPrintf(wxT(" London: %s\n"), now.Format(wxT("%a %T"), wxDateTime::WEST).c_str());
wxPrintf(wxT("New York: %s\n"), now.Format(wxT("%a %T"), wxDateTime::EDT).c_str());
}

输出示例:

 Tokyo: Wed 17:23:43
Moscow: Wed 12:23:43
Budapest: Wed 10:23:43
London: Wed 09:23:43
New York: Wed 04:23:43

日期跨度

以下示例展示了如何向日期/时间添加日期跨度。我们将当前时间增加一个月。

// datespan.cpp
#include <wx/wx.h>
#include <wx/datetime.h> int main(int argc, char **argv)
{
wxDateTime now = wxDateTime::Now();
wxString date1 = now.Format(wxT("%B %d %Y"));
wxPuts(date1);
wxDateSpan span(0, 1);
wxDateTime then = now.Add(span);
wxString date2 = then.Format(wxT("%B %d %Y"));
wxPuts(date2);
}

输出示例:

June 11 2025
July 11 2025

文件操作

wxWidgets 提供了多个类来简化文件操作。这是对文件的底层访问,与流式操作不同。

在以下示例中,我们使用 wxFile 类创建新文件并写入数据,同时会检测文件是否已打开。需注意:创建文件时会自动保持打开状态。

创建和写入文件

// createfile.cpp
#include <wx/wx.h>
#include <wx/file.h> int main(int argc, char **argv)
{
wxString str = wxT("You make me want to be a better man.\n");
wxFile file;
file.Create(wxT("quote"), true);
if (file.IsOpened())
wxPuts(wxT("the file is opened"));
file.Write(str);
file.Close();
if (!file.IsOpened())
wxPuts(wxT("the file is not opened"));
}

终端交互示例:

$ ls quote
ls: quote: No such file or directory
$ ./createfile
the file is opened
the file is not opened
$ cat quote
You make me want to be a better man.

wxTextFile 是一个简易的文本文件操作类,支持以行为单位处理文本文件。相比 wxFile 类,使用这个类会更加便捷。

在接下来的示例中,我们将输出文件的行数、首行和末行内容,最终读取并显示文件的全部内容。

文本文件操作

// readfile.cpp
#include <wx/wx.h>
#include <wx/textfile.h> int main(int argc, char **argv)
{
wxTextFile file(wxT("test.c"));
file.Open();
wxPrintf(wxT("Number of lines: %d\n"), file.GetLineCount());
wxPrintf(wxT("First line: %s\n"), file.GetFirstLine().c_str());
wxPrintf(wxT("Last line: %s\n"), file.GetLastLine().c_str());
wxPuts(wxT("----------------------------------------"));
wxString s;
for ( s = file.GetFirstLine(); !file.Eof();
s = file.GetNextLine() )
{
wxPuts(s);
}
file.Close();
}

test.c内容:

#include <glib.h>
#include <glib/gstdio.h> int main() {
g_mkdir("/home/vronskij/test", S_IRWXU);
}

输出:

Number of lines: 8
First line: #include <glib.h>
Last line: }
----------------------------------------
#include <glib.h>
#include <glib/gstdio.h> int main() {
g_mkdir("/home/vronskij/test", S_IRWXU);
}

目录枚举

在以下示例中,我们将打印当前工作目录下的所有文件和目录。

// dir.cpp
#include <wx/wx.h>
#include <wx/dir.h>
#include <wx/filefn.h> int main(int argc, char **argv)
{
wxDir dir(wxGetCwd());
wxString file;
bool cont = dir.GetFirst(&file, wxEmptyString, wxDIR_FILES | wxDIR_DIRS);
while (cont) {
wxPuts(file);
cont = dir.GetNext(&file);
}
}

输出示例:

dir
dir.cpp
temp
console
basic.cpp
basic
quote
createfile
console.cpp
basic.cpp~
test.c
console.cpp~
......

辅助类的应用示例暂且介绍到这里了,后续进行正式的wxWidgets开发说明。

在Linux下使用wxWidgets进行跨平台GUI开发(二)的更多相关文章

  1. Linux 下UVC&amp;V4L2技术简单介绍(二)

    通过前文Linux 下UVC&V4L2技术简单介绍(一)我们了解了UVC和V4L2的简单知识. 这里是USB设备的文档描写叙述:http://www.usb.org/developers/do ...

  2. Linux下的lds链接脚本简介(二)

    七. SECTIONS命令 SECTIONS命令告诉ld如何把输入文件的sections映射到输出文件的各个section: 如何将输入section合为输出section; 如何把输出section ...

  3. Linux下C ,C ++, Qt开发环境

    目录 Linux发行版的选择 安装常用的开发工具(这里针对C/C++/Qt) 安装openGL 中文输入法 安装sublime text 安装vscode apt-get常用命令 Qt环境 Qt常见问 ...

  4. 《使用wxWidgets进行跨平台程序开发》chap09——布局一个对话框

    ///////////////////////////////////////////////////////////////////////////// // Name: personalrecor ...

  5. Linux下的awk文本分析命令实例(二)

    awk实现求和.平均.最大值和最小值的计算操作 准备和数据文件 [finance@master2-dev ~]$ cat data.txt 求和 [finance@master2-dev ~]$ ca ...

  6. Linux下串口与工业协议的开发

    1.串口通信原理 串口通信定义 串口通信:数据的串行传送方式.串口通信可分为同步通信与异步通信. 同步通信:按照软件识别同步字符来实现数据的发送和接收. 将许多字符组成一个信息组进行发送 要求发送时钟 ...

  7. Linux下的sort排序命令详解(二)

    有时候学习脚本,你会发现sort命令后面跟了一堆类似-k1,2,或者-k1.2 -k3.4的东东,有些匪夷所思.今天,我们就来搞定它—-k选项! 1 准备素材 [root@FDMdevBI opt]# ...

  8. 《使用wxWidgets进行跨平台程序开发》chap02——一个简单的应用程序

    // Name: minimal.cpp // Purpose: Minimal wxWidgets sample // Author: Julian Smart #include "wx/ ...

  9. Ubuntu 14.04 下使用微软的跨平台轻量级开发神器 Visual Studio Code

    因为 Visual Studio Code 不断更新,官方最新 v1.32 的 .deb 包已经不能用于 Ubuntu 14.04 直接安装了. 下载 v1.31 的 deb 包安装即可:https: ...

  10. Linux 下从头再走 GTK+-3.0 (二)

    仅仅创建一个空白窗口是不够的,下面我们为创建的窗口添加一个按钮. 以 Hello,World!为例. 首先创建一个源文件:example2.c 内容如下. #include <gtk/gtk.h ...

随机推荐

  1. Go语言中的匿名函数和闭包,简单理解

    匿名函数是一种没有函数名的函数,即定义即使用:闭包作为一种携带状态的函数,我们可以简单地将它理解为"对象",因为它同时具备状态和行为. 匿名函数 匿名函数没有函数名,只有函数体,它 ...

  2. SQL Server 中的事务管理

    SQL Server 中的事务是什么? 事务是应该作为一个单元执行的一组 SQL 语句.这意味着事务确保所有命令都成功或都不成功.如果事务中的命令之一失败,则所有命令都失败,并且在数据库中修改的任何数 ...

  3. The surprising impact of mask-head architecture on novel class segmentation精讲

    目录 Mask RCNN Problem Definition Key idea Only Mask Head Code Summary Refer 大家好,这是我今天要讲的论文,它是2021年发表在 ...

  4. 递归--java进阶day08

    1.递归 2.案例 1.案例一 求出5的阶乘 我们会发现其中存在规律 我们先定义一个带返回值的方法,方便调用者使用 当给的数是1时,1的阶乘还是1,我们就可以直接返回 如果走了else,说明给的数不是 ...

  5. 【Java】操作数据库

    工具: eclipse MySQL Navicat for MySQL MySQL 连接驱动:mysql-connector-java-5.0.4-bin.jar SQL 代码 CREATE TABL ...

  6. C# 窗口过程消息处理 WndProc

    C# 窗口过程消息处理 WndProc WinForm WndProc 在 WinForm 中一般采用重写 WndProc 的方法对窗口或控件接受到的指定消息进行处理 示例:禁止通过关闭按钮或其他发送 ...

  7. 第一次3D打印,一个简单的小方块(rhino)

    一.建模 打开犀牛,我们选择立方体 我们点击上册的中心点 输入0,然后回车0 而后我们输长度:10,回车确认 同样的,宽度10 高度同样是10 回车确认后,我们得到一个正方形 二.导出模型 我们选择文 ...

  8. SynchronousQueue底层实现原理剖

    一.SynchronousQueue底层实现原理剖 SynchronousQueue(同步移交队列),队列长度为0.作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据.同样,从队列 ...

  9. 一个开源的 Blazor 跨平台入门级实战项目

    前言 今天大姚给大家分享一个开源(MIT license).免费的 Blazor 跨平台入门级实战项目:YourWeather. 项目介绍 YourWeather是一个开源(MIT license). ...

  10. 如何使用Streamlit快速创建仪表盘?

    上文有快速带大家了解streamlit,因为工作需要,这两天尝试构建了仪表盘,也就是咱们常说的Dashboard,本篇文章将教你如何使用 Streamlit 快速创建一个简单的仪表盘. 前言 Stre ...