QT 剥离

一、QVariant(std::any)

QT中的万能变量,通过C++17中的std::any替代。需要在工程属性中,配置属性(常规),设置C++语言标准,设置ISO C++ 17标准

1、插入
std::any a = 28;
std::any b = 3.14;
std::any c = std::make_any<bool>(true);
std::any d = std::string("hello world");
2、解析
qDebug() << std::any_cast<int>(a) << std::any_cast<double>(b) 
		 << std::any_cast<bool>(c) << std::any_cast<std::string>(d).c_str();
3、安全解析

std::any是类型安全的,转换失败会抛异常,abort()。包含三种安全解析的方式。可以通过try-catch捕捉,或者判断类型id,或者判断指针是否为空避免。
(1)try-catch

try
{
	qDebug() << std::any_cast<float>(b);
}
catch (const std::bad_any_cast& e)
{
	qDebug() << e.what();
}

(2)判断类型id

if (b.type() == typeid(double))
	std::any_cast<double>(b);

(3)判断指针是否为空

float* p1 = std::any_cast<float>(&b);    // 转换失败,return nullptr
double* p1 = std::any_cast<double>(&b);  // 转换成功,return not nullptr


二、QString(std::stringstream)

1、拼接字符串

并将其转换为const char*

#define TAG_NAME "apple"
int nNum = 10;

// QT
QString strTagName = QString("%1[%2]").arg(TAG_NAME).arg(nNum);
strTagName.toStdString().c_str();

// std::stringstream
std::stringstream ss;
ss << TAG_NAME << "[" << nNum << "]";
ss.str().c_str();
2、整数转换为字符串
int num = 10;
std::to_string(num);
3、QStringList(std::vector<string>
std::string data = "apple banana pool";  
std::istringstream iss(data);  
std::string str; 
std::vector<std::string> stringList; 
  
while (iss >> str) {  
    stringList.push_back(str);
}  


三、QHostInfo(boost::asio)

获取本地IP地址

#include "boost/asio.hpp"  // 最好写在当前头文件的最前面

void getLocalHost()
{
	boost::asio::io_context io_context;
	boost::asio::ip::tcp::resolver resolver(io_context);

	std::string strHostName = boost::asio::ip::host_name();
	boost::asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(strHostName, "");

	for (const auto& endpoint : endpoints)
	{
		bool bIsV4 = endpoint.endpoint().address().is_v4();
		if (bIsV4)
			qDebug() << endpoing.endpoint().address().to_string();
	}
}


四、QProcess(boost::process)

std::vector<std::string> args;
boost::process::child process("cmd.exe", args);
process.detach();


五、QSettings(WINAPI)

std::string GetIniString(const std::string& iniFilePath, const std::string& section, const std::string& key)
{
    char buffer[255];
    GetPrivateProfileStringA(section.c_str(), key.c_str(), "", buffer, sizeof(buffer), iniFilePath.c_str());
    return std::string(buffer);
}
 
int GetIniInt(const std::string& iniFilePath, const std::string& section, const std::string& key)
{
    return GetPrivateProfileIntA(section.c_str(), key.c_str(), 0, iniFilePath.c_str());
}
 
double GetIniDouble(const std::string& iniFilePath, const std::string& section, const std::string& key)
{
    std::string value = GetIniString(iniFilePath, section, key);
    return std::stod(value);
}
 
bool WriteIniString(const std::string& iniFilePath, const std::string& section, const std::string& key, const std::string& value)
{
    return WritePrivateProfileStringA(section.c_str(), key.c_str(), value.c_str(), iniFilePath.c_str()) != 0;
}


六、QFile

1、判断文件是否存在
boost::filesystem::exists(strPath);
2、判断是否是相对/绝对路径
boost::filesystem::path p;
p.is_relative();
p.is_absolute();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值