文章目录
一、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();