前言
使用qt开发已经有几年了,这里总结一点自己的经验。
这里记录的都是qt的特性
Q_GLOBAL_STATIC
通过这个宏不但定义简单,还可以获得线程安全性。
单例模式的实现
class Rule
{
public:
Rule() {}
virtual ~Rule() {}
public:
static Rule* instance();
public:
void test();
};
Q_GLOBAL_STATIC(Rule, rule)
Rule* Rule::instance()
{
return rule();
}
void Rule::test()
{
//todo
}
// 调用
Rule::instance()->test()
初始化,可能这个用的相对比较多一点
struct XXXX
{
QString a;
QString b;
};
Q_GLOBAL_STATIC(XXXX, xxxx)
// 调用
xxxx()->a = "";
xxxx()->b = "";
日志框架
QLoggingCategory,可以控制打印输出类别和模块,方便在调试时,过滤掉不关心的打印信息
Q_LOGGING_CATEGORY(xxxx, "xxxx")
#ifdef NO_DEBUG
# define INFO QT_NO_QDEBUG_MACRO()
# define DEBUG QT_NO_QDEBUG_MACRO()
# define WARNING QT_NO_QDEBUG_MACRO()
# define CRITICAL QT_NO_QDEBUG_MACRO()
#else
# define INFO qCInfo(xxxx)
# define DEBUG qCDebug(xxxx)
# define WARNING qCWarning(xxxx)
# define CRITICAL qCCritical(xxxx)
#endif
// 使用
// 这样就能控制,当前调试环境下有日志输出,其他环境不打印日志
DEBUG << "xxxxxxx";
高分辨率适配
// 一般需要同时开启
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
// Qt6是默认开启高分辨率适配
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif
设置全局字体和字号
// 在mian中进行设置
QFont font("Microsoft YaHei", 10);
app.setFont(font);
获取一些特殊路径
// 获取文档路径
// QStandardPaths有很多路径定义,可以看一下
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
文件夹创建
QDir dir;
// 创建单层目录
dir.mkdir();
// 创建完整目录
dir.mkpath();
Q_Q和Q_D
// 外部需要先定义d_ptr和q_ptr
// 通过Q_Q和Q_D能够获取到
XXXXPrivate *const d = reinterpret_cast<XXXXPrivate *>(qGetPtrHelper(d_ptr));
XXXX *const q = static_cast<XXXX *>(q_ptr);
窗口
windows:Qt创建窗口的时候,默认设置的是WS_POPUP属性,但是正常开发windows程序,会把窗口属性设置成WS_OVERLAPPED