在Xcode中产看QString的数据

lldb中默认没有对于QString的支持,需要自己添加。

1. 在用户目录下创建~/.lldb文件夹,并在文件夹中创建`qstring.py`文件。qstring.py中内容为:

import lldb

def utf16string_summary(value, *rest):

d = value.GetChildMemberWithName(“d”)

length = d.GetChildMemberWithName(“size”).GetValueAsSigned()

offset = d.GetChildMemberWithName(“offset”).GetValueAsSigned()

address = d.GetValueAsUnsigned() + offset

if length == 0:

return ‘””‘

error = lldb.SBError()

# UTF-16, so we multiply length by 2

bytes = value.GetProcess().ReadMemory(address, length * 2, error)

if bytes is None:

return ‘””‘

return ‘”%s”‘ % (bytes.decode(‘utf-16’).encode(‘utf-8’))

def __lldb_init_module(debugger, *rest):

print “registering QString”

summary = lldb.SBTypeSummary.CreateWithFunctionName(“qstring.utf16string_summary”)

summary.SetOptions(lldb.eTypeOptionHideChildren)

debugger.GetDefaultCategory().AddTypeSummary( lldb.SBTypeNameSpecifier(“QString”, False), summary )

2. 创建 ~/.lldbinit文件,写入一条命令`command script import ~/.lldb/qstring.py`

3. 重启Xcode即可生效

参考

https://github.com/tgebarowski/lldb-scripts

QT样式表单

建立步骤:

 1、建立文本文件,写入样式表内容,更改文件后缀名为qss;

 2、在工程中新建资源文件*.qrc,添加前缀文件(/名称),将qss文件加入前缀文件中;

 3、通过传入路径/文件名的方式创建一个QFile对象,以readonly的方式打开,然后readAll,最后qApp->setStyleSheet就可以使qss生效。

QT的样式表单允许我们在对程序不做任何代码上的更改的情况下轻松改变应用程序的外观。

其思想来源于网页设计中的CSS,即可以将功能设计和美学设计分开。

它的语法和概念和HTML CSS也是差不多的。

其原理可简单理解为:QT内部存在一个CSS语法解析器,我们将我们的样式控制以CSS语法定义到外部文件,CSS语法解析器解析后在调用相应的功能模块以完成样式变化。(其实这部分功能我们完全可以通过代码实现,只是这么做既麻烦而且一旦更改会很不方便)

比如:我在CSS定义字体颜色和大小,那么CSS语法解析器解读出我的意图后,可能就会调用freetype模块来实现此功能。

好处:1.将功能设计和美学设计分开

2.CSS设计资源多,查找容易

说明:QT Style 样式语法虽然和CSS语法差不多,但是其功能是其子集,在使用QT style时需具备CSS语法知识

 

CSS语法学习:http://www.w3school.com.cn/h.asp

CSS 参考手册:http://www.w3school.com.cn/cssref/index.asp

基本语法

1.      样式表单由一系列样式规则组成。每条规则可以分成两部分:选择器和声明

         

         选择器表示规则作用到哪些控件上;声明则详细说明了是什么规则。

2.      Qt的样式表语法不区分大小写,所以color,Color,coLor,coloR都表示同样的颜色属性。但是指代类的类名的时候,是区分大小写的。

3.      多个选择器可以并列使用,它们之间用逗号隔开,例如:

         QPushButton,QLineEdit, QComboBox{ color: red }

4.      声明部分也可以有多个并列,之间用分号隔开。当我们要设置的选择器有多个属性的时候,就需要并列多个声明,例如:

         QPushButton{ color: red; background-color: white }

        这条样式规则让按钮的字体变成红色,同时背景色变成白色。

         

选择器类别

Qt样式表单支持所有在CSS2中定义的选择器类型,下面介绍几种最为常用的选择器定义。

全局选择器

*

选中所有的Widget

特定类型选择器

QPushButton

选中所有QPushButton以及它派生出来的子类的对象

属性选择器

QPushButton[flat=”false”]

选中所有flat属性为false的按钮

属性选择器

可用于QT中所有具有toString方法的属性,例如QPushButton的text、checked等属性。

当属性是一个QStringList时,可以用~=这个符号来匹配其中的某一项。

因为属性往往是动态的,当属性更改了的时候,需要调整样式表,通常做法是删除样式表,再重新加载

选择器类别

类选择器

QPushButton

选中所有QPushButton的对象,但不包括其子类

ID选择器

QPushButton#okButton

选中所有object name是okButton的QPushButton对象

子控件选择器

QDialog QPushButton

选中Qdialog上的所有QPushButton子控件(直接子控件,间接子控件

嫡子控件选择器

QDialog > QPushButton

选中所有Qdialog的直接孩子QPushButton

精细控制(子控件)

对于比较复杂的控件,往往由多个子控件构成,比如QComboBox则由文本框和下拉按钮构成,对于QT STYLE 允许我们分别对子控件进行样式设定,这就大大增强了样式的灵活性

举例:QComboBox的下拉点击按钮设置背景图片:

QComboBox::drop-down { image:url(dropdown.png) }

 

关于子控件更多信息与使用方法可以访问

http://qt-project.org/doc/qt-5/stylesheet-examples.html#customizing-qcombobox

伪状态控制

根据具体控件的状态不同,选择器也可以有不同的状态,依次对应控件在不同状态的现实效果

基本写法:

1.      伪状态和选择器类名之间,用一个冒号分隔。

QPushButton:hover { color: white }

2.      伪状态也可以反向选择。

例如:当我们要设置除了鼠标悬停状态外其他所有状态的字体颜色,则可以像下面这样设置:QRadioButton:!hover { color: red }

3.      伪状态也可以并列,之间用冒号连接,表示伪状态之间用AND计算:

QCheckBox:hover:checked { color: white }

QPushButton:hover:!pressed { color: blue; }

4.      伪状态之间可以用OR计算:

QCheckBox:hover, QCheckBox:checked { color:white }

5.      伪状态可以和子控件合起来使用:

QComboBox::drop-down:hover { image:url(dropdown_bright.png) }

STYLE基础知识的说明

我们控制STYLE主要是将STYLE添加到控件上,通过控制控件不同状态的STYLE以达到整体的显示效果

那对于控件,我将其分解为以下几部分来理解

Ø  从层次上来说:

控件可分为前景与背景

前景:多包含文件,图片等内容

背景:多包含图片,图形等内容

Ø  从结构上来说:

由于QT style是模拟CSS的布局结构,因此其满足CSS的盒子模型

从里到外的4个区域分别是:

1: content

2:  padding

3:  border

4:  margin

通过控制一个控件的前景,背景内容已经结构上的4个区域,我们就可以达到对一个控件为所欲为的控制

QT如何下使用QSS

1.       定义样式文件


2.       将样式文件添加到资源中

3.       代码端加载样式文件

CSS基本功能

CSS的强大在于组合功能的强大,这里只是简单介绍基本功能,将简单功能组合起来才能实现好看的效果。

CSS 背景属性(Background)

属性

描述

CSS

background

在一个声明中设置所有的背景属性。

1

background-attachment

设置背景图像是否固定或者随着页面的其余部分滚动。

1

background-color

设置元素的背景颜色。

1

background-image

设置元素的背景图像。

1

background-position

设置背景图像的开始位置。

1

background-repeat

设置是否及如何重复背景图像。

1

background-clip

规定背景的绘制区域。

3

background-origin

规定背景图片的定位区域。

3

background-size

规定背景图片的尺寸。

3

CSS 边框属性(Border 和 Outline)

属性

描述

CSS

border

在一个声明中设置所有的边框属性。

1

border-bottom

在一个声明中设置所有的下边框属性。

1

border-bottom-color

设置下边框的颜色。

2

border-bottom-style

设置下边框的样式。

2

border-bottom-width

设置下边框的宽度。

1

border-color

设置四条边框的颜色。

1

border-left

在一个声明中设置所有的左边框属性。

1

border-left-color

设置左边框的颜色。

2

border-left-style

设置左边框的样式。

2

border-left-width

设置左边框的宽度。

1

border-right

在一个声明中设置所有的右边框属性。

1

border-right-color

设置右边框的颜色。

2

border-right-style

设置右边框的样式。

2

border-right-width

设置右边框的宽度。

1

border-style

设置四条边框的样式。

1

border-top

在一个声明中设置所有的上边框属性。

1

border-top-color

设置上边框的颜色。

2

border-top-style

设置上边框的样式。

2

border-top-width

设置上边框的宽度。

1

border-width

设置四条边框的宽度。

1

outline

在一个声明中设置所有的轮廓属性。

2

outline-color

设置轮廓的颜色。

2

outline-style

设置轮廓的样式。

2

outline-width

设置轮廓的宽度。

2

border-bottom-left-radius

定义边框左下角的形状。

3

border-bottom-right-radius

定义边框右下角的形状。

3

border-image

简写属性,设置所有 border-image-* 属性。

3

border-image-outset

规定边框图像区域超出边框的量。

3

border-image-repeat

图像边框是否应平铺(repeated)、铺满(rounded)或拉伸(stretched)。

3

border-image-slice

规定图像边框的向内偏移。

3

border-image-source

规定用作边框的图片。

3

border-image-width

规定图片边框的宽度。

3

border-radius

简写属性,设置所有四个 border-*-radius 属性。

3

border-top-left-radius

定义边框左上角的形状。

3

border-top-right-radius

定义边框右下角的形状。

3

box-decoration-break

3

box-shadow

向方框添加一个或多个阴影。

3

Box 属性

属性

描述

CSS

overflow-x

如果内容溢出了元素内容区域,是否对内容的左/右边缘进行裁剪。

3

overflow-y

如果内容溢出了元素内容区域,是否对内容的上/下边缘进行裁剪。

3

overflow-style

规定溢出元素的首选滚动方法。

3

rotation

围绕由 rotation-point 属性定义的点对元素进行旋转。

3

rotation-point

定义距离上左边框边缘的偏移点。

3

CSS 字体属性(Font)

属性

描述

CSS

font

在一个声明中设置所有字体属性。

1

font-family

规定文本的字体系列。

1

font-size

规定文本的字体尺寸。

1

font-size-adjust

为元素规定 aspect 值。

2

font-stretch

收缩或拉伸当前的字体系列。

2

font-style

规定文本的字体样式。

1

font-variant

规定是否以小型大写字母的字体显示文本。

1

font-weight

规定字体的粗细。

1

CSS 外边距属性(Margin)

属性

描述

CSS

margin

在一个声明中设置所有外边距属性。

1

margin-bottom

设置元素的下外边距。

1

margin-left

设置元素的左外边距。

1

margin-right

设置元素的右外边距。

1

margin-top

设置元素的上外边距。

1

CSS 内边距属性(Padding)

属性

描述

CSS

padding

在一个声明中设置所有内边距属性。

1

padding-bottom

设置元素的下内边距。

1

padding-left

设置元素的左内边距。

1

padding-right

设置元素的右内边距。

1

padding-top

设置元素的上内边距。

1

CSS 定位属性(Positioning)

属性

描述

CSS

bottom

设置定位元素下外边距边界与其包含块下边界之间的偏移。

2

clear

规定元素的哪一侧不允许其他浮动元素。

1

clip

剪裁绝对定位元素。

2

cursor

规定要显示的光标的类型(形状)。

2

display

规定元素应该生成的框的类型。

1

float

规定框是否应该浮动。

1

left

设置定位元素左外边距边界与其包含块左边界之间的偏移。

2

overflow

规定当内容溢出元素框时发生的事情。

2

position

规定元素的定位类型。

2

right

设置定位元素右外边距边界与其包含块右边界之间的偏移。

2

top

设置定位元素的上外边距边界与其包含块上边界之间的偏移。

2

vertical-align

设置元素的垂直对齐方式。

1

visibility

规定元素是否可见。

2

z-index

设置元素的堆叠顺序。

CSS 文本属性(Text)

属性

描述

CSS

color

设置文本的颜色。

1

direction

规定文本的方向 / 书写方向。

2

letter-spacing

设置字符间距。

1

line-height

设置行高。

1

text-align

规定文本的水平对齐方式。

1

text-decoration

规定添加到文本的装饰效果。

1

text-indent

规定文本块首行的缩进。

1

text-shadow

规定添加到文本的阴影效果。

2

text-transform

控制文本的大小写。

1

unicode-bidi

设置文本方向。

2

white-space

规定如何处理元素中的空白。

1

word-spacing

设置单词间距。

1

hanging-punctuation

规定标点字符是否位于线框之外。

3

punctuation-trim

规定是否对标点字符进行修剪。

3

text-align-last

设置如何对齐最后一行或紧挨着强制换行符之前的行。

3

text-emphasis

向元素的文本应用重点标记以及重点标记的前景色。

3

text-justify

规定当 text-align 设置为 “justify” 时所使用的对齐方法。

3

text-outline

规定文本的轮廓。

3

text-overflow

规定当文本溢出包含元素时发生的事情。

3

text-shadow

向文本添加阴影。

3

text-wrap

规定文本的换行规则。

3

word-break

规定非中日韩文本的换行规则。

3

word-wrap

允许对长的不可分割的单词进行分割并换行到下一行。

3

网址:http://blog.csdn.net/tiankefeng19850520/article/details/27183403?utm_source=tuicool&utm_medium=referral

——————— 本文来自 yansmile1 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yansmile1/article/details/52882965?utm_source=copy

QT 如何支持高清屏,视网膜屏幕

原文链接:Morten Johan S?rvig – Retina display support for Mac OS, iOS and X11

Qt 5.0中添加了对于retina显示的基本支持。即将到来的Qt 5.1中提供了新的API和缺陷修复,对于这一问题进行了改进。Qt 4.8也获得了良好的支持,我们反向移植了一些Qt 5的补丁。

尽管这些实现的努力和Mac以及iOS程序员最为相关,但是来看一看其它平台是如何处理高DPI显示这一问题,也是很有趣的。这里主要有两种方式:

  • 基于DPI缩放——Win32 GDIKDE。在这种方式中,应用程序在全物理设备分辨率下工作,使用系统提供的一个DPI设定或者缩放因子,用于缩放布局。字体通常会被操作系统自动缩放(只要您使用点数(point)而不是像素(pixel)来指定字体大小)
  • 另一种意义的像素。在这种方式中,应用程序并不知道物理解析度(在任何程度上)。物理像素被逻辑像素替代:
平台/API 逻辑的 物理的
HTML CSS像素 设备像素
Apple 像素
Android 密度无关像素(dp) (屏幕)像素
Direct2D 设备无关像素(DIP) 物理像素
Qt(过去) 像素 像素
Qt(现在) 设备无关像素 设备像素

在历史上,Qt已经支持基于DPI缩放的物理像素这一方式。在2009年时,对于Windows上的高DPI值的支持已经有所改进。Qt布局对于增加的DPI并没有考虑。现在Qt 5添加了对于“新增像素”这一缩放类型的支持。

(还有其它的高DPI实现么?欢迎大家在评论中进行指正。)

Mac OS X的高DPI支持

OS X上高DPI模式的关键是,以前绝大多数几何信息都是通过物理像素给定的,现在却是设备无关点。这包括桌面几何信息(例如15英寸的Retina MacBook Pro是1440×900而不是全分辨率2880×1800)、窗口几何信息和事件坐标。CoreGraphics绘制引擎知道全分辨率并且针对这一解析度生成输出。例如,对于普通屏幕和高DPI屏幕(其它参数都相同的情况下),一个100×100的窗口在屏幕上占用的区域是一样的。在高DPI屏幕的窗口后端存储包含了200×200像素。

这种模式的主要收益是向后兼容性以及自由的高DPI矢量图形。对于底层情况不了解的应用程序可以简单地像以前一样工作在相同的几何情况下,并且保留写死的像素值。同时,他们还可以使用如文本这样的矢量图形,而不用做任何修改。光栅图形引擎不能获得自动改进,但这是可以实现的。不好的一点是在代码中使用点和像素的时候,有不可避免的坐标系统混淆。

点到像素的缩放因子总是2x。在改变屏幕分辨率的时候,这一情况也是真的——点和像素总是被一个值同时缩放。当使用“More Space”进行缩放的时候,应用程序将会被渲染到一个大的后端存储,这个后端存储会被再缩小到物理屏幕解析度上。

在Mac OS上缩放用户界面解析度

如果您手里没有Retina硬件,在使用外部显示器的时候,有一种仿真模式还是很有用的。打开显示器(Displays)属性并且选择一种HiDPI模式。(如果没有,请查看stackoverflow上的这个问题。)

为OS X应用程序启用高DPI

高DPI模式是通过Info.Plist文件中的这些键值控制的:

<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>
<string>True</string>

qmake将会为您添加这些内容。(严格意义上说,它将会只添加NSPrincipalClass,NSHighResolutionCapable是可选的并且默认值为true)。

如果NSHighResolutionCapable被设置为false,或者缺少这些键值,那么应用程序将会被按“普通”解析度渲染然后放大。这样的结果看起来很糟糕并且应该避免,特别是因为高DPI模式是非常向后兼容的,并且应用程序可以获得很多高DPI支持而不用做任何修改。

缩放的Qt Creator

高DPI的Qt Creator

(除了一个更新“模式”图标的补丁之外,没有其它修改了。)

Qt的实现细节

Mac OS 10.8(10.7是非正式的?)添加了对高DPI的Retina显示的支持。Qt 4免费获得这一支持,因为它使用的是CoreGraphics绘制引擎。

Qt 5使用的是光栅绘制引擎并且Qt通过缩放绘图器变换(transform)实现了高DPI矢量的绘制。HITheme同时为Qt 4和5提供了高DPI的Mac风格。在Qt 5的Fusion风格中,对于高DPI模式的支持也已经修改好了。

OpenGL是一种基于设备像素的API并且对于高DPI模式也仍然如此。在NSView中有一个flag可以用来开启或者禁用2x缩放——Qt在所有情况下都可以设置它。Shaders运行在设备像素中。

Qt Quick 1是构建于QGraphicsView之上的,它是一个QWidget并且通过QPainter获得对于高DPI的支持。

Qt Quick 2是基于Scene Graph(和OpenGL),已经更新了高DPI的支持。Qt Quick控件(也就是以前的Desktop Component)也已经更新了在高DPI模式下的渲染,其中包括距离场(distance field)文本渲染。(译者注:关于距离场,可以参考Yoann Lopes – Text Rendering in the QML Scene Graph以及iKDE上的译文。)

这里的卖点是应用程序开发人员不需要关心这些,您只需要在设备无关像素的空间里舒适地开发,Qt和/或OS会为您处理那些复杂的事情。但有一个例外,光栅内容(raster content)——需要提供高DPI光栅内容,并且应用程序代码需要正确处理这些内容。

窗口部件和绘图器

QPainter代码绝大多数情况下都和原来一样。我们来看看绘制渐变(gradient)的代码:

QRect destinationRect = ...
QGradient gradient = ...
painter.fillRect(rect, QBrush(gradient));

在高DPI显示器上,这个渐变在屏幕上的大小还是一样的,但是被填充了更多的(设备)像素。

绘制一个像素映射(pixmap)也是类似的:

QRect destinationRect = ...
QPixmap pixmap = ...
painter.drawPixmap(destinationRect, pixmap);

为了避免在高DPI显示器上出现缩放失真,像素映射必须包含足够的像素:两倍于destinationRect的宽和高。应用程序可以直接提供它们,也可以使用QIcon来管理不同的解析度:

QRect destinationRect = ...
QIcon icon = ...
painter.drawPixmap(destinationRect, icon.pixmap(destinationRect.size()));

QIcon::pixmap()已经被修改了,可以在高DPI系统中返回一个更大的像素映射。这种行为的改变会破坏现有的代码,所以它是由AA_UseHighDpiPixmaps这个应用程序属性来控制的:

qApp->setAttribute(Qt::AA_UseHighDpiPixmaps);

在Qt 5.1中这个属性默认值是关闭的,但在未来的Qt发布中它很有可能默认为打开。

极端情况和devicePixelRatio

Qt的窗口部件有一些极端情况。在理想情况下,它一直使用QIcon,并且在绘制的时候会使用正确的像素映射,但是实际情况是Qt API经常直接生成和使用像素映射。当像素映射的大小被用来计算布局的几何信息时,会发生错误——如果一个像素映射已经是高分辨率的,那么在屏幕上它就不应该再占用更多的空间。

通过使用QPixmap::devicePixelRatio(),就能让200×200的像素映射实际占据100×100的设备无关像素。由QIcon::pixmap()返回的像素映射中devicePixelRatio已经设置好了。

例如QLabel就是一个“像素映射消费者”:

QPixmap pixmap2x = ...
pixmap2x.setDevicePixelRatio(2.0);
QLabel *label = ...
label->setPixmap(pixmap2x);

然后QLabel会除以devicePixelRatio来获得布局的大小:

QSize layoutSize = pixmap.size() / pixmap.devicePixelRatio();

与此类似的几种情况在Qt中都已经修复,并且应用程序代码在启用AA_UseHighDpiPixmaps之前也需要做类似处理。

下面几个Qt类中都提供了devicePixelRatio()的读写函数:

注释
QWindow::devicePixelRatio() 推荐使用的读写函数
QScreen::devicePixelRatio()
QGuiApplication::devicePixelRatio() 如果没有QWindow指针,请使用这个
QImage::[set]devicePixelRatio()
QPixmap::[set]devicePixelRatio()

文本

字体大小还可以和原来一样,会在高DPI显示中产生类似的大小(但会有一点小问题)。字体的像素大小是设备无关的像素大小。您在高DPI显示中永远不会得到太小的文本。

QGLWidget

OpenGL是在设备像素空间中工作的。例如,传递给glViewport的宽和高应该是设备像素。QGLWidget::resizeGL()中的宽和高也是设备像素的。

不管怎样,QGLWidget::width()实际上就是QWidget::width(),它返回的是设备无关像素的值。如果需要,用它来乘以widget->windowHandle()->devicePixelRatio()可以解决很多问题。

Qt Quick 2和控件

Qt Quick 2和Qt Quick控件可以直接使用。因为窗口部件的坐标是设备无关像素的。Qt Quick也有几个和光栅相关的极端情况,因为QML的Image元素是通过URL来指定图像源的,这样就避免了像素映射的传递。

Qt Quick控件

还有一个例外是OpenGL着色器(shader),它运行在设备像素空间中并且可以看到全分辨率。在通常情况下这没有什么问题,我们应该知道的一件重要的事情是,鼠标坐标是设备无关像素的,也许需要被转换成设备像素。

运行中的着色器效果实例

管理高解析度的光栅内容

正如我们所看到的,在缩放的情况下,光栅内容看起来会不够好,所以必须提供高解析度的内容。作为应用程序开发人员,您有两个选项:(请忽略“什么都不做”选项)

  • 使用高解析度版本替换现有光栅内容
  • 另外提供一份高解析度内容

第一个选项很简单,因为每个资源只有一个版本。可是您也许会发现(或者您的设计师会告诉您)像图标这样的资源只有在它被创建的那个特定解析度下看起来才最好。为了解决这个问题,Qt沿用了“@2x”这种图像文件名的方案:

foo.png
foo@2x.png

这样高解析度的内容和原来的一一对应。在需要的时候,“@2x”的版本会被QML的Image元素以及QIcon自动加载。

Image { source = “foo.png” }
QIcon icon(“foo.png”)

(对于QIcon请记住使用AA_UseHighDpiPixmaps)

试验性的跨平台的高解析度支持

QPA允许我们相对容易的完成跨平台的实现。Qt现在把这一问题分为三层:

  • 应用程序层(应用程序代码和使用QPA类的Qt代码)
  • QPA层(QWindow、QScreen、QBackingStore)
  • 平台插件层(QPlatform*子类)

简化一下,应用程序层是在设备无关像素空间中工作的,并不知道设备像素。平台插件是在设备像素空间中工作的,并不知道设备无关像素。QPA层在两者之间,基于一个由环境变量QT_HIGHDPI_SCALE_FACTOR指定的缩放因子进行转换。

实际上,这个情况还会更复杂一些,各层之间会有泄露的事情发生,并且在Mac和iOS下还会有一些例外情况。

代码在github上。最后是XCB下的Qt Creator的截屏:

DPI缩放的Qt Creator

QT_HIGDPI_SCALE_FACTOR=2缩放的Qt Creator