Qt的一些经验总结(1)

202 阅读1分钟

前言

使用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