用Qt做安卓开发都会遇到权限的问题,早期的安卓版本可以直接通过 AndroidManifest.xml 配置文件来添加需要的权限,这样在安装app的时候就会提示该app需要哪些权限让用户同意,现在的安卓版本都改成了动态权限,需要在app运行的时候弹出提示让用户确认再有权限,Qt迎合了这种策略内置了动态申请权限的方法 QtAndroid::requestPermissionsSync。
//动态设置权限 bool checkPermission(const QString &permission) { #ifdef Q_OS_ANDROID #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QtAndroid::PermissionResult result = QtAndroid::checkPermission(permission); if (result == QtAndroid::PermissionResult::Denied) { QtAndroid::requestPermissionsSync(QStringList() << permission); result = QtAndroid::checkPermission(permission); if (result == QtAndroid::PermissionResult::Denied) { return false; } } #endif #endif return true; } int main(int argc, char *argv[]) { QApplication a(argc, argv); //请求权限 checkPermission("android.permission.READ_EXTERNAL_STORAGE"); checkPermission("android.permission.WRITE_EXTERNAL_STORAGE"); return a.exec(); }Qt重载qDebug输出自定义的信息。
struct FunctionInfo { QString function; QString name; QString groupEnabled; QString action; QString group; friend QDebug operator << (QDebug debug, const FunctionInfo &functionInfo) { QString info = QString("功能: %1 名称: %2 启用: %3 方法: %4 分组: %5") .arg(functionInfo.function).arg(functionInfo.name).arg(functionInfo.groupEnabled) .arg(functionInfo.action).arg(functionInfo.group); debug << info; return debug; } };对高分屏不同缩放比例的自适应处理方法。
//方法1:在main函数的最前面加上下面这句 5.6版本才开始有这个函数 #if (QT_VERSION > QT_VERSION_CHECK(5,6,0)) QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif //方法2:在可执行文件同目录下新建文件 qt.conf 填入下面内容 [Platforms] WindowsArguments = dpiawareness=0 //方法3:在main函数最前面设置Qt内部的环境变量 qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1.5"); //方法4:新版本的Qt比如Qt5.14修正了对高分屏的处理支持不是整数的缩放 qputenv("QT_ENABLE_HIGHDPI_SCALING", "1"); QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWidget的QTabBar对象上,所以只要设置全局的QTabBar的这个属性关闭即可。为啥要设置全局的呢,因为如果只是对QTabWidget设置了该属性,而在QMainWindow窗体中QDockWidget合并自动形成的选项卡只有QTabBar对象导致依然是有切换按钮。
//对tabWidget设置无切换按钮 ui->tabWidget->setUsesScrollButtons(false); //对tabBar设置无切换按钮 ui->tabWidget->tabBar()->setUsesScrollButtons(false); //对整个系统的选项卡设置无切换按钮 QTabBar{qproperty-usesScrollButtons:false;} //设置选项卡自动拉伸 这玩意居然之前自动计算来设置原来内置了哇咔咔 QTabBar{qproperty-expanding:false;} //设置选项卡关闭按钮可见 QTabBar{qproperty-tabsClosable:true;} //还有其他属性参见QTabBar头文件有惊喜 //依旧是万能大法所有可视化类的 Q_PROPERTY 包含的属性都可以这样设置QMainWindow的分割线默认尺寸比较大,有时候想设置小一点或者不想要,最开始的时候以为是QSplitter,打印所有子元素找遍了也没找到影子,最后发现样式表中有对应设置的内容。
//真的是做梦也没想到要这样设置 QMainWindow::separator{width:1px;height:1px;margin:1px;padding:1px;background:#FF0000;}QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产生图标,哇咔咔好牛逼。
static const char * const imgData[] = { "15 11 6 1", " c None", "+ c #979797", "@ c #C9C9C9", "$ c #C1C1C1", "b c None", "d c None", " $++++++++$ ", "$+bbbbbbbb+$ ", "+b $$ +$ ", "+b $@ +$ ", "+b +$", "+b d+", "+b d+$", "+b $$ d+$ ", "+b $@ d+$ ", "$+dddddddd+$ ", " $++++++++$ "}; //这样就能直接显示一个箭头的图形 QImage img(imgData); QLabel lab; lab.setPixmap(QPixmap::fromImage(img)); lab.show();在停靠窗体QDockWidget和QOpenGLWidget同时使用的时候,从嵌入状态切换到浮动状态或者浮动状态切换到嵌入状态,QOpenGLWidget的上下文会被打乱导致白屏失效,需要在main函数中开头位置设置下共享OpenGL上下文。
int main(int argc, char *argv[]) { //需要设置共享上下文不然停靠窗体从正常到浮动后QOpenGLWidget窗体会失效 #if (QT_VERSION > QT_VERSION_CHECK(5,4,0)) QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); #endif QApplication a(argc, argv); ... }关于Qt中文乱码的问题,个人也稍微总结了一点,应该可以解决99%以上的Qt版本的乱码问题。
第一步:代码文件选择用utf8编码带bom。