Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qcoregraphics.mm
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qcoregraphics_p.h"
5
6#include <private/qcore_mac_p.h>
7#include <qpa/qplatformpixmap.h>
8#include <QtGui/qicon.h>
9#include <QtGui/private/qpaintengine_p.h>
10#include <QtCore/qdebug.h>
11#include <QtCore/qcoreapplication.h>
12#include <QtCore/qoperatingsystemversion.h>
13
15
17
18// ---------------------- Images ----------------------
19
21{
22 CGBitmapInfo bitmapInfo = kCGImageAlphaNone;
23 switch (image.format()) {
25 bitmapInfo = CGBitmapInfo(kCGImageAlphaFirst) | kCGBitmapByteOrder32Host;
26 break;
28 bitmapInfo = CGBitmapInfo(kCGImageAlphaNoneSkipFirst) | kCGBitmapByteOrder32Host;
29 break;
31 bitmapInfo = CGBitmapInfo(kCGImageAlphaPremultipliedLast) | kCGBitmapByteOrder32Big;
32 break;
34 bitmapInfo = CGBitmapInfo(kCGImageAlphaLast) | kCGBitmapByteOrder32Big;
35 break;
37 bitmapInfo = CGBitmapInfo(kCGImageAlphaNoneSkipLast) | kCGBitmapByteOrder32Big;
38 break;
40 bitmapInfo = CGBitmapInfo(kCGImageAlphaPremultipliedFirst) | kCGBitmapByteOrder32Host;
41 break;
42 default: break;
43 }
44 return bitmapInfo;
45}
46
47CGImageRef qt_mac_toCGImage(const QImage &inImage)
48{
49 CGImageRef cgImage = inImage.toCGImage();
50 if (cgImage)
51 return cgImage;
52
53 // Convert image data to a known-good format if the fast conversion fails.
54 return inImage.convertToFormat(QImage::Format_ARGB32_Premultiplied).toCGImage();
55}
56
58{
59 static const auto deleter = [](void *image, const void *, size_t) { delete static_cast<QImage *>(image); };
60 QCFType<CGDataProviderRef> dataProvider =
61 CGDataProviderCreateWithData(new QImage(image), image.bits(),
62 image.sizeInBytes(), deleter);
63
64 return CGImageMaskCreate(image.width(), image.height(), 8, image.depth(),
65 image.bytesPerLine(), dataProvider, NULL, false);
66}
67
68void qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage)
69{
70 CGContextSaveGState( inContext );
71 CGContextTranslateCTM (inContext, 0, inBounds->origin.y + CGRectGetMaxY(*inBounds));
72 CGContextScaleCTM(inContext, 1, -1);
73
74 CGContextDrawImage(inContext, *inBounds, inImage);
75
76 CGContextRestoreGState(inContext);
77}
78
80{
81 const size_t w = CGImageGetWidth(image),
82 h = CGImageGetHeight(image);
84 ret.fill(Qt::transparent);
85 CGRect rect = CGRectMake(0, 0, w, h);
88 return ret;
89}
90
91#ifdef Q_OS_MACOS
92
94
95@implementation NSImage (QtExtras)
96+ (instancetype)imageFromQImage:(const QImage &)image
97{
98 if (image.isNull())
99 return nil;
100
101 QCFType<CGImageRef> cgImage = image.toCGImage();
102 if (!cgImage)
103 return nil;
104
105 // We set up the NSImage using an explicit NSBitmapImageRep, instead of
106 // [NSImage initWithCGImage:size:], as the former allows us to correctly
107 // set the size of the representation to account for the device pixel
108 // ratio of the original image, which in turn will be reflected by the
109 // NSImage.
110 auto nsImage = [[NSImage alloc] initWithSize:NSZeroSize];
111 auto *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
112 imageRep.size = image.deviceIndependentSize().toCGSize();
113 [nsImage addRepresentation:[imageRep autorelease]];
114 Q_ASSERT(CGSizeEqualToSize(nsImage.size, imageRep.size));
115
116 return [nsImage autorelease];
117}
118
119+ (instancetype)imageFromQIcon:(const QIcon &)icon
120{
121 return [NSImage imageFromQIcon:icon withSize:0];
122}
123
124+ (instancetype)imageFromQIcon:(const QIcon &)icon withSize:(int)size
125{
126 if (icon.isNull())
127 return nil;
128
129 auto availableSizes = icon.availableSizes();
130 if (availableSizes.isEmpty() && size > 0)
131 availableSizes << QSize(size, size);
132
133 auto nsImage = [[[NSImage alloc] initWithSize:NSZeroSize] autorelease];
134
135 for (QSize size : std::as_const(availableSizes)) {
137 if (image.isNull())
138 continue;
139
140 QCFType<CGImageRef> cgImage = image.toCGImage();
141 if (!cgImage)
142 continue;
143
144 auto *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
145 imageRep.size = image.deviceIndependentSize().toCGSize();
146 [nsImage addRepresentation:[imageRep autorelease]];
147 }
148
149 if (!nsImage.representations.count)
150 return nil;
151
152 [nsImage setTemplate:icon.isMask()];
153
154 if (size)
155 nsImage.size = CGSizeMake(size, size);
156
157 return nsImage;
158}
159@end
160
162
163QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size)
164{
165 // ### TODO: add parameter so that we can decide whether to maintain the aspect
166 // ratio of the image (positioning the image inside the pixmap of size \a size),
167 // or whether we want to fill the resulting pixmap by stretching the image.
168 const NSSize pixmapSize = NSMakeSize(size.width(), size.height());
169 QPixmap pixmap(pixmapSize.width, pixmapSize.height);
171 [image setSize:pixmapSize];
172 const NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
174 if (!ctx)
175 return QPixmap();
176 NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithCGContext:ctx flipped:YES];
177 if (!gc)
178 return QPixmap();
179 [NSGraphicsContext saveGraphicsState];
180 [NSGraphicsContext setCurrentContext:gc];
181 [image drawInRect:iconRect fromRect:iconRect operation:NSCompositingOperationSourceOver fraction:1.0 respectFlipped:YES hints:nil];
182 [NSGraphicsContext restoreGraphicsState];
183 return pixmap;
184}
185
186#endif // Q_OS_MACOS
187
188#ifdef QT_PLATFORM_UIKIT
189
190QImage qt_mac_toQImage(const UIImage *image, QSizeF size)
191{
192 // ### TODO: same as above
194 ret.fill(Qt::transparent);
196 if (!ctx)
197 return QImage();
198 UIGraphicsPushContext(ctx);
199 const CGRect rect = CGRectMake(0, 0, size.width(), size.height());
200 [image drawInRect:rect];
201 UIGraphicsPopContext();
202 return ret;
203}
204
205#endif // QT_PLATFORM_UIKIT
206
207// ---------------------- Colors and Brushes ----------------------
208
210{
211 QColor qtColor;
212 CGColorSpaceModel model = CGColorSpaceGetModel(CGColorGetColorSpace(color));
213 const CGFloat *components = CGColorGetComponents(color);
214 if (model == kCGColorSpaceModelRGB) {
215 qtColor.setRgbF(components[0], components[1], components[2], components[3]);
216 } else if (model == kCGColorSpaceModelCMYK) {
217 qtColor.setCmykF(components[0], components[1], components[2], components[3]);
218 } else if (model == kCGColorSpaceModelMonochrome) {
219 qtColor.setRgbF(components[0], components[0], components[0], components[1]);
220 } else {
221 // Colorspace we can't deal with.
222 qWarning("Qt: qt_mac_toQColor: cannot convert from colorspace model: %d", model);
223 Q_ASSERT(false);
224 }
225 return qtColor;
226}
227
228#ifdef Q_OS_MACOS
229QColor qt_mac_toQColor(const NSColor *color)
230{
231 QColor qtColor;
232 switch (color.type) {
233 case NSColorTypeComponentBased: {
234 const NSColorSpace *colorSpace = [color colorSpace];
235 if (colorSpace == NSColorSpace.genericRGBColorSpace
236 && color.numberOfComponents == 4) { // rbga
238 [color getComponents:components];
239 qtColor.setRgbF(components[0], components[1], components[2], components[3]);
240 break;
241 } else if (colorSpace == NSColorSpace.genericCMYKColorSpace
242 && color.numberOfComponents == 5) { // cmyk + alpha
244 [color getComponents:components];
245 qtColor.setCmykF(components[0], components[1], components[2], components[3], components[4]);
246 break;
247 }
248 }
250 default: {
251 const NSColor *tmpColor = [color colorUsingColorSpace:NSColorSpace.genericRGBColorSpace];
252 CGFloat red = 0, green = 0, blue = 0, alpha = 0;
253 [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
254 qtColor.setRgbF(red, green, blue, alpha);
255 break;
256 }
257 }
258
259 return qtColor;
260}
261#endif
262
264{
265 QBrush qtBrush;
266 CGColorSpaceModel model = CGColorSpaceGetModel(CGColorGetColorSpace(color));
267 if (model == kCGColorSpaceModelPattern) {
268 // Colorspace we can't deal with; the color is drawn directly using a callback.
269 qWarning("Qt: qt_mac_toQBrush: cannot convert from colorspace model: %d", model);
270 Q_ASSERT(false);
271 } else {
272 qtBrush.setStyle(Qt::SolidPattern);
273 qtBrush.setColor(qt_mac_toQColor(color));
274 }
275 return qtBrush;
276}
277
278#ifdef Q_OS_MACOS
279static bool qt_mac_isSystemColorOrInstance(const NSColor *color, NSString *colorNameComponent, NSString *className)
280{
281 // We specifically do not want isKindOfClass: here
282 if ([color.className isEqualToString:className]) // NSPatternColorSpace
283 return true;
284 if (color.type == NSColorTypeCatalog &&
285 [color.catalogNameComponent isEqualToString:@"System"] &&
286 [color.colorNameComponent isEqualToString:colorNameComponent])
287 return true;
288 return false;
289}
290
291QBrush qt_mac_toQBrush(const NSColor *color, QPalette::ColorGroup colorGroup)
292{
293 QBrush qtBrush;
294
295 // QTBUG-49773: This calls NSDrawMenuItemBackground to render a 1 by n gradient; could use HITheme
296 if ([color.className isEqualToString:@"NSMenuItemHighlightColor"]) {
297 qWarning("Qt: qt_mac_toQBrush: cannot convert from NSMenuItemHighlightColor");
298 return qtBrush;
299 }
300
301 // Not a catalog color or a manifestation of System.windowBackgroundColor;
302 // only retrieved from NSWindow.backgroundColor directly
303 if ([color.className isEqualToString:@"NSMetalPatternColor"]) {
304 // NSTexturedBackgroundWindowMask, could theoretically handle this without private API by
305 // creating a window with the appropriate properties and then calling NSWindow.backgroundColor.patternImage,
306 // which returns a texture sized 1 by (window height, including frame), backed by a CGPattern
307 // which follows the window key state... probably need to allow QBrush to store a function pointer
308 // like CGPattern does
309 qWarning("Qt: qt_mac_toQBrush: cannot convert from NSMetalPatternColor");
310 return qtBrush;
311 }
312
313 // No public API to get these colors/stops;
314 // both accurately obtained through runtime object inspection on OS X 10.11
315 // (the NSColor object has NSGradient i-vars for both color groups)
316 if (qt_mac_isSystemColorOrInstance(color, @"_sourceListBackgroundColor", @"NSSourceListBackgroundColor")) {
317 QLinearGradient gradient;
318 if (colorGroup == QPalette::Active) {
319 gradient.setColorAt(0, QColor(233, 237, 242));
320 gradient.setColorAt(0.5, QColor(225, 229, 235));
321 gradient.setColorAt(1, QColor(209, 216, 224));
322 } else {
323 gradient.setColorAt(0, QColor(248, 248, 248));
324 gradient.setColorAt(0.5, QColor(240, 240, 240));
325 gradient.setColorAt(1, QColor(235, 235, 235));
326 }
327 return QBrush(gradient);
328 }
329
330 // A couple colors are special... they are actually instances of NSGradientPatternColor, which
331 // override set/setFill/setStroke to instead initialize an internal color
332 // ([NSColor colorWithCalibratedWhite:0.909804 alpha:1.000000]) while still returning the
333 // ruled lines pattern image (from OS X 10.4) to the user from -[NSColor patternImage]
334 // (and providing no public API to get the underlying color without this insanity)
335 if (qt_mac_isSystemColorOrInstance(color, @"controlColor", @"NSGradientPatternColor") ||
336 qt_mac_isSystemColorOrInstance(color, @"windowBackgroundColor", @"NSGradientPatternColor")) {
337 qtBrush.setStyle(Qt::SolidPattern);
338 qtBrush.setColor(qt_mac_toQColor(color.CGColor));
339 return qtBrush;
340 }
341
342 if (color.type == NSColorTypePattern) {
343 NSImage *patternImage = color.patternImage;
344 const QSizeF sz(patternImage.size.width, patternImage.size.height);
345 // FIXME: QBrush is not resolution independent (QTBUG-49774)
346 qtBrush.setTexture(qt_mac_toQPixmap(patternImage, sz));
347 } else {
348 qtBrush.setStyle(Qt::SolidPattern);
349 qtBrush.setColor(qt_mac_toQColor(color));
350 }
351 return qtBrush;
352}
353#endif
354
355// ---------------------- Geometry Helpers ----------------------
356
357void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform)
358{
359 CGAffineTransform old_xform = CGAffineTransformIdentity;
360 if (orig_xform) { //setup xforms
361 old_xform = CGContextGetCTM(hd);
362 CGContextConcatCTM(hd, CGAffineTransformInvert(old_xform));
363 CGContextConcatCTM(hd, *orig_xform);
364 }
365
366 //do the clipping
367 CGContextBeginPath(hd);
368 if (rgn.isEmpty()) {
369 CGContextAddRect(hd, CGRectMake(0, 0, 0, 0));
370 } else {
371 for (const QRect &r : rgn) {
372 CGRect mac_r = CGRectMake(r.x(), r.y(), r.width(), r.height());
373 CGContextAddRect(hd, mac_r);
374 }
375 }
376 CGContextClip(hd);
377
378 if (orig_xform) {//reset xforms
379 CGContextConcatCTM(hd, CGAffineTransformInvert(CGContextGetCTM(hd)));
380 CGContextConcatCTM(hd, old_xform);
381 }
382}
383
384// move to QRegion?
385void qt_mac_scale_region(QRegion *region, qreal scaleFactor)
386{
387 if (!region || !region->rectCount())
388 return;
389
390 QVector<QRect> scaledRects;
391 scaledRects.reserve(region->rectCount());
392
393 for (const QRect &rect : *region)
394 scaledRects.append(QRect(rect.topLeft() * scaleFactor, rect.size() * scaleFactor));
395
396 region->setRects(&scaledRects[0], scaledRects.count());
397}
398
399// ---------------------- QMacCGContext ----------------------
400
402{
403 initialize(paintDevice);
404}
405
406void QMacCGContext::initialize(QPaintDevice *paintDevice)
407{
408 // Find the underlying QImage of the paint device
409 switch (int deviceType = paintDevice->devType()) {
410 case QInternal::Pixmap: {
411 if (auto *platformPixmap = static_cast<QPixmap*>(paintDevice)->handle()) {
413 initialize(platformPixmap->buffer());
414 else
415 qWarning() << "QMacCGContext: Unsupported pixmap class" << platformPixmap->classId();
416 } else {
417 qWarning() << "QMacCGContext: Empty platformPixmap";
418 }
419 break;
420 }
421 case QInternal::Image:
422 initialize(static_cast<const QImage *>(paintDevice));
423 break;
425 qWarning() << "QMacCGContext: not implemented: Widget class";
426 break;
427 default:
428 qWarning() << "QMacCGContext:: Unsupported paint device type" << deviceType;
429 }
430}
431
433{
434 QPaintEngine *paintEngine = painter->paintEngine();
435
436 // Handle the case of QMacPrintEngine, which has an internal QCoreGraphicsPaintEngine
437 while (QPaintEngine *aggregateEngine = QPaintEnginePrivate::get(paintEngine)->aggregateEngine())
438 paintEngine = aggregateEngine;
439
440 paintEngine->syncState();
441
442 if (Qt::HANDLE handle = QPaintEnginePrivate::get(paintEngine)->nativeHandle()) {
443 context = static_cast<CGContextRef>(handle);
444 return;
445 }
446
447 if (paintEngine->type() != QPaintEngine::Raster) {
448 qWarning() << "QMacCGContext:: Unsupported paint engine type" << paintEngine->type();
449 return;
450 }
451
452 // The raster paint engine always operates on a QImage
453 Q_ASSERT(paintEngine->paintDevice()->devType() == QInternal::Image);
454
455 // On behalf of one of these supported painter devices
456 switch (int painterDeviceType = painter->device()->devType()) {
458 case QInternal::Image:
460 break;
461 default:
462 qWarning() << "QMacCGContext:: Unsupported paint device type" << painterDeviceType;
463 return;
464 }
465
466 // Applying the clip is so entangled with the rest of the context setup
467 // that for simplicity we just pass in the painter.
468 initialize(static_cast<const QImage *>(paintEngine->paintDevice()), painter);
469}
470
471void QMacCGContext::initialize(const QImage *image, QPainter *painter)
472{
473 QCFType<CGColorSpaceRef> colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
474 context = CGBitmapContextCreate((void *)image->bits(), image->width(), image->height(), 8,
475 image->bytesPerLine(), colorSpace, qt_mac_bitmapInfoForImage(*image));
476
477 // Invert y axis
478 CGContextTranslateCTM(context, 0, image->height());
479 CGContextScaleCTM(context, 1, -1);
480
481 const qreal devicePixelRatio = image->devicePixelRatio();
482
484 // Set the clip rect which is an intersection of the system clip and the painter clip
487
488 if (painter->hasClipping()) {
489 // To make matters more interesting the painter clip is in device-independent pixels,
490 // so we need to scale it to match the device-pixels of the system clip.
491 QRegion painterClip = painter->clipRegion();
492 qt_mac_scale_region(&painterClip, devicePixelRatio);
493
494 painterClip.translate(deviceTransform.dx(), deviceTransform.dy());
495
496 if (clip.isEmpty())
497 clip = painterClip;
498 else
499 clip &= painterClip;
500 }
501
502 qt_mac_clip_cg(context, clip, nullptr);
503
504 CGContextTranslateCTM(context, deviceTransform.dx(), deviceTransform.dy());
505 }
506
507 // Scale the context so that painting happens in device-independent pixels
508 CGContextScaleCTM(context, devicePixelRatio, devicePixelRatio);
509}
510
\inmodule QtGui
Definition qbrush.h:30
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
void setRgbF(float r, float g, float b, float a=1.0)
Sets the color channels of this color to r (red), g (green), b (blue) and a (alpha,...
Definition qcolor.cpp:1317
void setColorAt(qreal pos, const QColor &color)
Creates a stop point at the given position with the given color.
Definition qbrush.cpp:1563
The QIcon class provides scalable icons in different modes and states.
Definition qicon.h:20
bool isNull() const
Returns true if the icon is empty; otherwise returns false.
Definition qicon.cpp:1019
QList< QSize > availableSizes(Mode mode=Normal, State state=Off) const
Definition qicon.cpp:1144
QPixmap pixmap(const QSize &size, Mode mode=Normal, State state=Off) const
Returns a pixmap with the requested size, mode, and state, generating one if necessary.
Definition qicon.cpp:834
\inmodule QtGui
Definition qimage.h:37
@ Format_RGBA8888
Definition qimage.h:59
@ Format_RGB32
Definition qimage.h:46
@ Format_RGBA8888_Premultiplied
Definition qimage.h:60
@ Format_ARGB32_Premultiplied
Definition qimage.h:48
@ Format_ARGB32
Definition qimage.h:47
@ Format_RGBX8888
Definition qimage.h:58
\inmodule QtGui
Definition qbrush.h:394
QMacCGContext()=default
virtual int devType() const
static QPaintEnginePrivate * get(QPaintEngine *paintEngine)
\inmodule QtGui
virtual Type type() const =0
Reimplement this function to return the paint engine \l{Type}.
QRegion systemClip() const
QPaintDevice * paintDevice() const
Returns the device that this engine is painting on, if painting is active; otherwise returns \nullptr...
The QPainter class performs low-level painting on widgets and other paint devices.
Definition qpainter.h:46
QPaintDevice * device() const
Returns the paint device on which this painter is currently painting, or \nullptr if the painter is n...
QPaintEngine * paintEngine() const
Returns the paint engine that the painter is currently operating on if the painter is active; otherwi...
QRegion clipRegion() const
Returns the currently set clip region.
const QTransform & deviceTransform() const
Returns the matrix that transforms from logical coordinates to device coordinates of the platform dep...
bool hasClipping() const
Returns true if clipping has been set; otherwise returns false.
ColorGroup
\value Disabled \value Active \value Inactive \value Normal synonym for Active
Definition qpalette.h:49
Returns a copy of the pixmap that is transformed using the given transformation transform and transfo...
Definition qpixmap.h:27
QImage toImage() const
Converts the pixmap to a QImage.
Definition qpixmap.cpp:408
\inmodule QtCore\reentrant
Definition qrect.h:30
The QRegion class specifies a clip region for a painter.
Definition qregion.h:27
int rectCount() const noexcept
void setRects(const QRect *rect, int num)
Sets the region using the array of rectangles specified by rects and number.
bool isEmpty() const
Returns true if the region is empty; otherwise returns false.
\inmodule QtCore
Definition qsize.h:208
\inmodule QtCore
Definition qsize.h:25
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
EGLContext ctx
rect
[4]
Combined button and popup list for selecting options.
@ transparent
Definition qnamespace.h:47
void * HANDLE
@ SolidPattern
Definition image.cpp:4
static void * context
float CGFloat
#define Q_FALLTHROUGH()
void qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage)
QBrush qt_mac_toQBrush(CGColorRef color)
void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform)
QColor qt_mac_toQColor(CGColorRef color)
QImage qt_mac_toQImage(CGImageRef image)
void qt_mac_scale_region(QRegion *region, qreal scaleFactor)
CGImageRef qt_mac_toCGImage(const QImage &inImage)
QT_USE_NAMESPACE QT_BEGIN_NAMESPACE CGBitmapInfo qt_mac_bitmapInfoForImage(const QImage &image)
CGImageRef qt_mac_toCGImageMask(const QImage &image)
static bool initialize()
Definition qctf.cpp:94
#define qWarning
Definition qlogging.h:166
return ret
GLuint64 GLenum void * handle
GLfloat GLfloat GLfloat w
[0]
GLint GLenum GLint components
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLboolean r
[2]
GLuint color
[2]
GLfloat GLfloat GLfloat GLfloat h
GLbyte GLbyte blue
Definition qopenglext.h:385
GLfloat GLfloat GLfloat alpha
Definition qopenglext.h:418
GLbyte green
Definition qopenglext.h:385
struct CGContext * CGContextRef
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
void gc(QV4::ExecutionEngine &engine, GCFlags flags)
Definition qmlutils.cpp:118
double qreal
Definition qtypes.h:187
static QWindowsDirect2DPlatformPixmap * platformPixmap(QPixmap *p)
static QInputDevice::DeviceType deviceType(const UINT cursorType)
const char className[16]
[1]
Definition qwizard.cpp:100
QSqlQueryModel * model
[16]
rect deviceTransform(view->viewportTransform()).map(QPointF(0
widget render & pixmap
QPainter painter(this)
[7]
QGraphicsSvgItem * red