在Linux下使用wxWidgets进行跨平台GUI开发(二)
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开发(二)的更多相关文章
- Linux 下UVC&V4L2技术简单介绍(二)
通过前文Linux 下UVC&V4L2技术简单介绍(一)我们了解了UVC和V4L2的简单知识. 这里是USB设备的文档描写叙述:http://www.usb.org/developers/do ...
- Linux下的lds链接脚本简介(二)
七. SECTIONS命令 SECTIONS命令告诉ld如何把输入文件的sections映射到输出文件的各个section: 如何将输入section合为输出section; 如何把输出section ...
- Linux下C ,C ++, Qt开发环境
目录 Linux发行版的选择 安装常用的开发工具(这里针对C/C++/Qt) 安装openGL 中文输入法 安装sublime text 安装vscode apt-get常用命令 Qt环境 Qt常见问 ...
- 《使用wxWidgets进行跨平台程序开发》chap09——布局一个对话框
///////////////////////////////////////////////////////////////////////////// // Name: personalrecor ...
- Linux下的awk文本分析命令实例(二)
awk实现求和.平均.最大值和最小值的计算操作 准备和数据文件 [finance@master2-dev ~]$ cat data.txt 求和 [finance@master2-dev ~]$ ca ...
- Linux下串口与工业协议的开发
1.串口通信原理 串口通信定义 串口通信:数据的串行传送方式.串口通信可分为同步通信与异步通信. 同步通信:按照软件识别同步字符来实现数据的发送和接收. 将许多字符组成一个信息组进行发送 要求发送时钟 ...
- Linux下的sort排序命令详解(二)
有时候学习脚本,你会发现sort命令后面跟了一堆类似-k1,2,或者-k1.2 -k3.4的东东,有些匪夷所思.今天,我们就来搞定它—-k选项! 1 准备素材 [root@FDMdevBI opt]# ...
- 《使用wxWidgets进行跨平台程序开发》chap02——一个简单的应用程序
// Name: minimal.cpp // Purpose: Minimal wxWidgets sample // Author: Julian Smart #include "wx/ ...
- Ubuntu 14.04 下使用微软的跨平台轻量级开发神器 Visual Studio Code
因为 Visual Studio Code 不断更新,官方最新 v1.32 的 .deb 包已经不能用于 Ubuntu 14.04 直接安装了. 下载 v1.31 的 deb 包安装即可:https: ...
- Linux 下从头再走 GTK+-3.0 (二)
仅仅创建一个空白窗口是不够的,下面我们为创建的窗口添加一个按钮. 以 Hello,World!为例. 首先创建一个源文件:example2.c 内容如下. #include <gtk/gtk.h ...
随机推荐
- 修改docker的默认存储位置及镜像存储位置
前言 Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录,用以存放拉取的镜像和创建的容器等. 不过由于此目录一般都位于系统盘,遇到系统盘比较小,而镜像和容器多了 ...
- vue 判断某个时间小于当前时间
如下 new Date().getTime() 获取当前时间(毫秒) 我需要对比的时间为秒,所以需要除于1000 <div v-if="scope.row.created_at < ...
- IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡
日前,IvorySQL 4.0 重磅发布,全面支持 PostgreSQL 17,并且增强了对 Oracle 的兼容性.关于 IvorySQL 4.0 的介绍,各位小伙伴可以通过这篇文章回顾:Ivory ...
- 配置QtJambi编译环境
所有代码都是以C++ GUI Qt 4编程(第二版)为准,只是重新用Java + QtJambi重写了. 当前编译IDE是intellij idea 2024, 系统win 11 LTSC.需要配置的 ...
- 基于Lighthouse搭建高颜值的YesPlayMusic网易云播放器
本文介绍了如何使用腾讯云的Lighthouse轻量应用服务器来搭建一个高颜值的第三方网易云播放器. 项目简介 本文使用的是YesPlayMusic项目,这是一款高颜值的第三方网易云播放器,它完全可以作 ...
- freertos消息队列的值传递和指针传递
消息队列的使用方法总结: 1.消息队列初始化(定义一个消息队列的结构体),一般在main.c中完成. 2.消息队列的发送: a extern 消息队列 b 定义一个结构体的指针指向消息消息队列 ...
- 100行代码实现Chat2XX(DB/ Web/ KnowledgeBase)
这两年基于大模型的应用可谓五花八门,Chat2DB,Chat2Web,Chat2KnowledgeBase,Chat2XXX等等.本质上都是以自然语言作为系统输入,通过各种手段获取额外的上下文信息,然 ...
- win自带的远程桌面内网也能用简直太香了,mstsc配置方法以及解决由于没有远程桌面授权服务器可以提供许可证
以前都是用mstsc命令远程连接控制有公网ip的服务器,最近内网设置了下也能用简直太香了,终于不用担心某desk限时长限次数了: 配置方法: 右键 计算机 选择属性,点击远程设置,在远程协助框中勾选 ...
- 容器化 MCP Server!
大家好!我是韩老师. 本文是 MCP 系列文章的第五篇,之前的四篇是: Code Runner MCP Server,来了! 从零开始开发一个 MCP Server! 一键安装 MCP Server! ...
- 企业级开源CMS新标杆,三分钟搭建多语言官网!
HuoCMS是基于ThinkPHP6和Vue3研发的现代化内容管理系统,专为中小企业及开发者打造全场景数字化解决方案.系统采用MIT开源协议,支持多语言.多终端适配,内置可视化编辑器与SEO优化体系, ...