Qt::ApplicationAttribute各枚举值含义

Qt::ApplicationAttribute 是指程序级别属性,设置应用程序级属性,即设置后,该QApplication、QCoreApplication、QGuiApplication代表的整个进程下的所有属性都被改变。Qt中还有Qt::WidgetAttribute属性,其仅仅对指定的QWidget窗体属性改变。关于Qt::WidgetAttribute枚举的含义,请参考

Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总》。


  今天测试时候换了一批新的电脑。linux/mac都正常,就win下显示有些问题。检查后发现,新装的win系统总是默认缩放150%,高清屏显示也是自带200%缩放。这个缩放会造成显示的一些问题。
 

QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

 同样150%缩放模式时:使用和不使用的区别。

 

 Qt已经封装好了很多的Attribute。分别针对本窗口(WidgetAttribute)和全局窗口(ApplicationAttribute),比如上边提到的支持高清屏。各种Attribute各项属性是如何实现的,除非特别感兴趣,否则估计很少去深入研究。还是实战一点知道有这么个东西,可以查找比较靠谱。

  官网说明再这里:https://doc.qt.io/qt-6/qt.html#details。

enum Qt::ApplicationAttribute 指定应用程序范围功能的行为的属性。

  相关函数有两个setAttribute用来设置属性,testAttribute用来读取是否设置。

// class QCoreApplication
static void setAttribute(Qt::ApplicationAttribute attribute, bool on = true);
static bool testAttribute(Qt::ApplicationAttribute attribute);

 属性(qt-6的doc)

不同版本 Attribute 会有新增和弃用。有空简单试一遍当前版本Attribute的作用,再遇到类似问题知道解决办法。qt6文档里去掉了很多Attribute比如AA_EnableHighDpiScaling。是因为直接支持了吗?打算6.2出来后再去研究Qt6。

Qt::AA_DontShowIconsInMenus = 2
  下拉菜单是否显示最左侧的图标,默认显示,开启后则不显示。

Qt::AA_DontShowShortcutsInContextMenus = 28
  下拉菜单是否显快捷键提示,默认显示,开启后则不显示。

Qt::AA_NativeWindows = 3
  确保所有控件均视为native window 。关于什么是native window窗体,请参考

      《QWidget的parentWidget、window、nativeParentWidget区别与理解》文章。
Qt::AA_DontCreateNativeWidgetSiblings = 4
  这个要跟Qt::WA_NativeWindow(Qt::WidgetAttribute)配合起来使用,测试到Qt::WA_NativeWindow时再详细说明。大致就是给一个Widget设置了Qt::WA_NativeWindow后Widget的同级(它parent的其他children)保持原状。

Qt::AA_PluginApplication = AA_MacPluginApplication = 5
  指示Qt用于编写插件。关闭一些无用的属性,只对Mac有效。实际关闭那些没去看具体怎么实现的。

Qt::AA_DontUseNativeMenuBar = 6
  指定菜单栏是否应在支持它的平台上用作本机菜单栏(mac和linux)。win设置此属性无效。设置之后顶部菜单栏将使用系统自带的。
  https://blog.csdn.net/hitzsf/article/details/113617050

Qt::AA_MacDontSwapCtrlAndMeta = 7
  Mac的设置没有去测试 。
  https://www.kancloud.cn/apachecn/pyqt4-doc-zh/1947160 : 在Mac OS X在默认情况下, Qt的交换控制和Meta (命令)键(即,当控制被按下时, Qt的发送梅塔,每当元被按下控制被发送) 。当此属性为True, Qt会不会做翻转。 QKeySequence.StandardShortcuts也将相应地翻动(即,QKeySequence.Copy将命令+ C在键盘上,无论设置的值,虽然什么是输出QKeySequence.toString (QKeySequence.PortableText)会有所不同) 。

Qt::AA_Use96Dpi = 8
  假设屏幕的分辨率为96 DPI,而不是使用操作系统提供的分辨率。不管那个屏幕,字体实际渲染出来的大小一致。实测开启这个后窗口内的文字大小不随系统缩放改变而改变。

Qt::AA_SynthesizeTouchForUnhandledMouseEvents = 11
  应用程序不接受的所有鼠标事件将转换为触摸事件。没有做过触摸屏,也没办法测试。

Qt::AA_SynthesizeMouseForUnhandledTouchEvents = 12
  应用程序不接受的所有触摸事件将转换为鼠标左键事件。默认情况下,此属性处于启用状态。没有做过触摸屏,也没办法测试。
  https://blog.csdn.net/nicai_xiaoqinxi/article/details/102673560

Qt::AA_ForceRasterWidgets = 14
  使顶级小部件使用纯光栅曲面,并且不支持非本机基于GL的子小部件。测试了下开启后如果程序用到 glwidget会显示一片空白,如果没用到则正常。

Qt::AA_UseDesktopOpenGL = 15
  强制使用桌面OpenGL。

Qt::AA_UseOpenGLES = 16
  在使用动态加载OpenGL实现的平台上强制使用OpenGL ES 2.0或更高版本。

Qt::AA_UseSoftwareOpenGL = 17
  强制在使用动态加载OpenGL实现的平台上使用基于软件的OpenGL实现。

Qt::AA_ShareOpenGLContexts = 18
  这允许在属于不同顶级窗口的QOpenGLWidget实例之间共享OpenGL资源。默认开启

  性能排名 DesktopOpenGL > OpenGLES > Soft。默认情况下使用DesktopOpenGL。
  OpenGLES和Soft一般只有在虚拟机上用(渲染效率慢,也会增加开销)。这个也解决了我之前遇到的一个bug,就是vtk写的程序,在虚拟机上测试各种黑屏。因为虚拟机没有DesktopOpenGL,只有SoftOpenGL。需要改了后才能再虚拟机上测试(打包前记得取消)。

  https://www.cnblogs.com/slcode/p/e745b120173372ffb74582d6de78f0d2.html

Qt::AA_SetPalette = 19

qDebug() << QGuiApplication::testAttribute(Qt::AA_SetPalette);

判断有没有设置过Palette,默认是false,qApp->palette()会返回系统主题。
  如果设置过qApp->setPalette(const QPalette &);则 testAttribute(Qt::AA_SetPalette)会返回真,qApp->palette()会返回设置的主题。

Qt::AA_UseStyleSheetPropagationInWidgetStyles = 22
  这个就是关于样式表的继承问题,默认情况下一个控件的样式表是使用最后一次的setStyleSheet,如果开启这个设置,每个控件会找父子关系最近的样式表跟setStyleSheet顺序无关。

Qt::AA_DontUseNativeDialogs = 23
  系统有内置对话框(比如打开文件),Qt也自己实现了所平台的系统对话框(如果不自己改的话贼丑)。默认情况下使用系统对话框,当找不到系统对话框时(比如打包时系统版本不一样、调了第三方测窗口句柄)会调内置对话框。如果设置了AA_DontUseNativeDialogs后,所有对话框会直接用Qt内置的。

Qt::AA_SynthesizeMouseForUnhandledTabletEvents = 24
  应用程序不接受的所有平板电脑事件将转换为鼠标事件。没有做过触摸屏,也没办法测试。

Qt::AA_CompressHighFrequencyEvents = 25
  只对触摸屏有效,没有用过。每次传入一批操作而不是一个操作。

Qt::AA_CompressTabletEvents = 29
  只对触摸屏有效,没有用过。看说明大概是AA_CompressHighFrequencyEvents每次发送一批操作,AA_CompressTabletEvents允许每次接受一批操作。

Qt::AA_DontCheckOpenGLContextThreadAffinity = 26
  还没用过QOpenGLContext。

Qt::AA_DisableShaderDiskCache = 27
  禁用磁盘上着色器程序二进制文件的缓存。默认情况下,Qt Quick、QPainter的OpenGL后端以及使用QOpenGLShaderProgram及其addCacheableShaderFromSource重载之一的任何应用程序都将在支持glProgramBinary()的系统上的共享或每进程缓存存储位置使用基于磁盘的程序二进制缓存。目前还没遇到过这种情况。

https://ask.csdn.net/questions/1585299

Qt::AA_DisableSessionManager = 31
  5.14新增的,没试过。禁用QSessionManager。

Qt::AA_DisableNativeVirtualKeyboard = 9
  5.15新增的,没试过。设置此属性后,当文本输入小部件在没有物理键盘的系统上获得焦点时,本机屏幕虚拟键盘将不会自动显示。
 


原文链接:https://blog.csdn.net/a15005784320/article/details/114155629

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值