Qt 平台差异处理 #

平台宏定义 #

Qt 提供的平台宏 #

cpp
// Qt 提供的平台宏
Q_OS_WIN        // Windows
Q_OS_MACOS      // macOS
Q_OS_LINUX      // Linux
Q_OS_UNIX       // Unix 系统(包括 Linux 和 macOS)
Q_OS_IOS        // iOS
Q_OS_ANDROID    // Android

// 使用示例
#ifdef Q_OS_WIN
    // Windows 特定代码
#elif defined(Q_OS_MACOS)
    // macOS 特定代码
#elif defined(Q_OS_LINUX)
    // Linux 特定代码
#endif

qmake 中的平台判断 #

qmake
# 平台判断
win32 {
    # Windows 特定配置
    SOURCES += windows_specific.cpp
    LIBS += -luser32
}

unix {
    # Unix/Linux/macOS 特定配置
    SOURCES += unix_specific.cpp
}

macx {
    # macOS 特定配置
    ICON = app.icns
    QMAKE_INFO_PLIST = Info.plist
}

linux {
    # Linux 特定配置
    LIBS += -ludev
}

android {
    # Android 特定配置
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
}

ios {
    # iOS 特定配置
    QMAKE_INFO_PLIST = iOS.plist
}

文件路径处理 #

跨平台路径 #

cpp
#include <QDir>
#include <QStandardPaths>

// 使用 QDir 处理路径
QString path = QDir::cleanPath("path/to/file");
QString nativePath = QDir::toNativeSeparators(path);

// 获取标准路径
QString desktop = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString documents = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QString appData = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);

// 构建路径
QString configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QString configFile = configPath + QDir::separator() + "config.ini";

配置文件存储 #

cpp
QString getConfigPath()
{
    QString configPath;
    
#ifdef Q_OS_WIN
    configPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#elif defined(Q_OS_MACOS)
    configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
#else
    configPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
#endif
    
    QDir dir(configPath);
    if (!dir.exists()) {
        dir.mkpath(".");
    }
    
    return configPath;
}

平台特定功能 #

原生对话框 #

cpp
// 使用原生文件对话框
QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog, false);  // 使用原生对话框

// 平台特定设置
#ifdef Q_OS_MACOS
    dialog.setFilter(QDir::Hidden | QDir::AllEntries);
#endif

系统托盘 #

cpp
#include <QSystemTrayIcon>

void setupSystemTray()
{
    if (!QSystemTrayIcon::isSystemTrayAvailable()) {
        qDebug() << "System tray not available";
        return;
    }
    
    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(this);
    
#ifdef Q_OS_WIN
    trayIcon->setIcon(QIcon(":/icon.ico"));
#elif defined(Q_OS_MACOS)
    trayIcon->setIcon(QIcon(":/icon.icns"));
#else
    trayIcon->setIcon(QIcon(":/icon.png"));
#endif
    
    trayIcon->show();
}

高 DPI 支持 #

cpp
// 启用高 DPI 缩放
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif

// 获取设备像素比
qreal dpr = qApp->devicePixelRatio();

// 处理高 DPI 图片
QPixmap pixmap(":/image@2x.png");
pixmap.setDevicePixelRatio(2.0);

平台特定 UI #

cpp
void applyPlatformStyle()
{
#ifdef Q_OS_MACOS
    // macOS 风格
    QApplication::setStyle("macintosh");
    
    // 使用 macOS 原生菜单栏
    menuBar()->setNativeMenuBar(true);
    
#elif defined(Q_OS_WIN)
    // Windows 风格
    QApplication::setStyle("windows");
    
#elif defined(Q_OS_LINUX)
    // Linux 风格
    QApplication::setStyle("fusion");
#endif
}

下一步 #

现在你已经掌握了平台差异处理,接下来学习 打包发布,了解各平台的打包部署方法!

最后更新:2026-03-29