Note :
Type | Specifier |
---|---|
const char* |
%s |
char |
%c |
float / double |
%f , %g |
int , long , long long |
%d , %ld , %lld |
unsigned , unsigned long , unsigned long long |
%u , %lu , %llu |
uint64 -> uintmax_t , int64 -> intmax_t |
%ju , %jd |
size_t |
%zu |
// 如果不包括任务栏,则使用 availableGeometry()
rcPrimary = theScreen->geometry();
if (monitorinfo.dwFlags == MONITORINFOF_PRIMARY) {
// 如果不包括任务栏,则使用 monitorinfo.rcWork
g_rcPrimary = monitorinfo.rcMonitor;
}
else {
g_rcSecond = monitorinfo.rcMonitor;
}
比较上面 1、2 两个方法的结果,发现方法 1 获取的矩形区域是不正确的,因此用方法 2 来代替。 如果是单显卡接两个显示器,则没有问题。
from 区别总结
选用原则
如果不确定,或者 1 2 两种情况都有,那么,就选择 QWidget。
QWidget & QFrame
setAttribute(Qt::WA_StyledBackground);
目的是脱离父窗口的样式。如果你从 QWidget 子类化一个自定义小部件,那么为了使用样式表,你需要为自定义小部件提供一个 paintEvent:
void myWidget::paintEvent(QPaintEvent *event) {
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
再 paintEvent 中加入那几句就 OK 了,可以使用 setStyleSheet 改变背景。
QGraphicsScene 是管理 QGraphicsItem 的容器,它继承自 QObject,而不是 QWidget,因此它本身不可见,需要和 QGraphicsView 配合使用才能看到管理的项目。
QGraphicsScene 通过查找算法来管理 item 的位置,默认算法是 BSP tree。
Qt 绘图之 QGraphicsScene QGraphicsView QGraphicsItem 详解
Graphics View 提供的是一种类似于 Qt model-view 的编程。多个 views 可以监视同一个场景,而场景包含多个具有多种几何外形的 items。
Qt 提供了处理图像数据的类:QImage, QPixmap 和 QPicture。
QPixmap 依赖于硬件,QImage 不依赖于硬件。 QPixmap 主要是用于绘图,针对屏幕显示而最佳化设计,QImage 主要是为图像 I/O、图片访问和像素修改而设计的。 当图片小的情况下,直接用 QPixmap 进行加载,画图时无所谓,当图片大的时候如果直接用 QPixmap 进行加载,会占很大的内存,一般一张几十 K 的图片,用 QPixmap 加载进来会放大很多倍。 所以一般图片大的情况下,用 QImage 进行加载,然后转乘 QPixmap 用户绘制。QPixmap 绘制效果是最好的(第一种代码的方式)。
大图加载:
QImage figutils::loadBigImageThumbNail(const QString& fileName, QSize sizeCtrl) {
QImageReader reader; // 设置图片名
reader.setFileName(fileName); // 读取图片大小
reader.setAutoTransform(true);
QSize imageSize = reader.size(); // 缩放图片尺寸以适应
imageSize.scale(sizeCtrl, Qt::KeepAspectRatio); // 设置图片大小
reader.setScaledSize(imageSize);
QImage img = reader.read();
return img;
}
from QGraphicsScene 类作为容器(MV 中的模型 Model),用于存储所有的图形元素; QGraphicsView 则是观察窗口,可以显示场景的一部分或者全局;所有的图形元素均继承自 QGraphicsItem。
我们再来看看 QImage 类的几个构造函数:
// 浅拷贝
QImage(uchar * data, int width, int height, Format format)
// 浅拷贝
QImage(const uchar * data, int width, int height, Format format)
// 浅拷贝
QImage(uchar * data, int width, int height, int bytesPerLine, Format format)
// 浅拷贝
QImage(const uchar * data, int width, int height, int bytesPerLine, Format format)
// 深拷贝
QImage QImage::copy(const QRect & rectangle = QRect()) const
// 浅拷贝
QImage QImage::rgbSwapped() const
由于 qt4 没有 RGBA8888,采用最接近 RGBA8888 的是 ARGB32,颜色会有点偏差。
此图片的存储方式是,使用 32 位具有特定字节顺序的红绿蓝透(RGBA)格式(8-8-8-8)。 与 ARGB32 不同的是,此格式是具有特定字节顺序的,也就是说,在大端在前(big endian)和小端在前(little endian)的机器上, 32 位数据编码的内容是不同的,分别会是(0xRRGGBBAA)和(0xAABBGGRR)。 在任何其它的架构的机器上,如果称其格式为 0xRR、0xGG、0xBB、0xAA,则颜色的顺序也是相同的。
每一个 32bit 中,RGBA 各分量的顺序是有序的。如果按字节来读取,那么会依次读取字节 0xRR、0xGG、0xBB、0xAA。 那么,在大端 big_endian 上,这个 32bits 会被表示为 0xRRGGBBAA,在小端 little_endian 上,会被表示为 0xAABBGGRR。 可以记作,Byte 存储方式顺序固定,4-Byte 读取的数值不定。
此图片的存储方式是,使用 32 位的透红绿蓝(ARGB)格式 (0xAARRGGBB)。
32bit 的 ARGB,按 32bit 整型去访问,始终是 0xAARRGGBB。如果按字节来读取(也就是存储方式相关),在不同的系统上,读取的顺序不同。 如果在大端 big_endian 架构上,按字节会被读取为 0xAA、0xRR、0xGG、0xBB;在小端 little_endian 架构上,按字节会被读取为 0xBB、0xGG、0xRR、0xAA。 可以记作,Byte 存储方式顺序不定,4-Byte 读取的数值固定。