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