Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qmovie.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 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
137#include "qmovie.h"
138
139#include "qglobal.h"
140#include "qelapsedtimer.h"
141#include "qimage.h"
142#include "qimagereader.h"
143#include "qpixmap.h"
144#include "qrect.h"
145#include "qelapsedtimer.h"
146#include "qtimer.h"
147#include "qpair.h"
148#include "qmap.h"
149#include "qlist.h"
150#include "qbuffer.h"
151#include "qdir.h"
152#include "private/qobject_p.h"
153#include "private/qproperty_p.h"
154
155#define QMOVIE_INVALID_DELAY -1
156
158
160{
161public:
163 int delay;
165 inline QFrameInfo(bool endMark)
167 { }
168
169 inline QFrameInfo()
171 { }
172
174 : pixmap(std::move(pixmap)), delay(delay), endMark(false)
175 { }
176
177 inline bool isValid()
178 {
179 return endMark || !(pixmap.isNull() && (delay == QMOVIE_INVALID_DELAY));
180 }
181
182 inline bool isEndMarker()
183 { return endMark; }
184
185 static inline QFrameInfo endMarker()
186 { return QFrameInfo(true); }
187};
189
191{
192 Q_DECLARE_PUBLIC(QMovie)
193
194public:
196 bool isDone();
197 bool next();
198 int speedAdjustedDelay(int delay) const;
199 bool isValid() const;
200 bool jumpToFrame(int frameNumber);
201 int frameCount() const;
202 bool jumpToNextFrame();
203 QFrameInfo infoForFrame(int frameNumber);
204 void reset();
205
208 emit q_func()->stateChanged(newState);
209 }
210
211 // private slots
212 void _q_loadNextFrame();
213 void _q_loadNextFrame(bool starting);
214
216
217 void setSpeed(int percentSpeed) { q_func()->setSpeed(percentSpeed); }
219
220 QMovie::MovieState movieState = QMovie::NotRunning;
226 int nextDelay = 0;
227 int playCounter = -1;
230 QMovie::CacheNone)
231 bool haveReadAll = false;
232 bool isFirstIteration = true;
235
237};
238
242{
243 q_ptr = qq;
245}
246
250{
252 if (reader->device())
255 nextFrameNumber = 0;
257 nextDelay = 0;
258 playCounter = -1;
259 haveReadAll = false;
260 isFirstIteration = true;
261 frameMap.clear();
262}
263
267{
268 return (playCounter == 0);
269}
270
280{
281 return int( (qint64(delay) * qint64(100) ) / qint64(speed) );
282}
283
297{
298 Q_Q(QMovie);
299
300 if (frameNumber < 0)
301 return QFrameInfo(); // Invalid
302
303 if (haveReadAll && (frameNumber > greatestFrameNumber)) {
304 if (frameNumber == greatestFrameNumber+1)
305 return QFrameInfo::endMarker();
306 return QFrameInfo(); // Invalid
307 }
308
309 if (cacheMode == QMovie::CacheNone) {
310 if (frameNumber != currentFrameNumber+1) {
311 // Non-sequential frame access
312 if (!reader->jumpToImage(frameNumber)) {
313 if (frameNumber == 0) {
314 // Special case: Attempt to "rewind" so we can loop
315 // ### This could be implemented as QImageReader::rewind()
316 if (reader->device()->isSequential())
317 return QFrameInfo(); // Invalid
321 QColor bgColor = reader->backgroundColor();
322 QSize scaledSize = reader->scaledSize();
323 delete reader;
324 if (fileName.isEmpty())
326 else
328 if (!reader->canRead()) // Provoke a device->open() call
329 emit q->error(reader->error());
331 reader->setBackgroundColor(bgColor);
332 reader->setScaledSize(scaledSize);
333 } else {
334 return QFrameInfo(); // Invalid
335 }
336 }
337 }
338 if (reader->canRead()) {
339 // reader says we can read. Attempt to actually read image
340 QImage anImage = reader->read();
341 if (anImage.isNull()) {
342 // Reading image failed.
343 return QFrameInfo(); // Invalid
344 }
345 if (frameNumber > greatestFrameNumber)
346 greatestFrameNumber = frameNumber;
347 return QFrameInfo(QPixmap::fromImage(std::move(anImage)), reader->nextImageDelay());
348 } else if (frameNumber != 0) {
349 // We've read all frames now. Return an end marker
350 haveReadAll = true;
351 return QFrameInfo::endMarker();
352 } else {
353 // No readable frames
354 haveReadAll = true;
355 return QFrameInfo();
356 }
357 }
358
359 // CacheMode == CacheAll
360 if (frameNumber > greatestFrameNumber) {
361 // Frame hasn't been read from file yet. Try to do it
362 for (int i = greatestFrameNumber + 1; i <= frameNumber; ++i) {
363 if (reader->canRead()) {
364 // reader says we can read. Attempt to actually read image
365 QImage anImage = reader->read();
366 if (anImage.isNull()) {
367 // Reading image failed.
368 return QFrameInfo(); // Invalid
369 }
371 QFrameInfo info(QPixmap::fromImage(std::move(anImage)), reader->nextImageDelay());
372 // Cache it!
374 if (i == frameNumber) {
375 return info;
376 }
377 } else {
378 // We've read all frames now. Return an end marker
379 haveReadAll = true;
380 return frameNumber == greatestFrameNumber + 1 ? QFrameInfo::endMarker() : QFrameInfo();
381 }
382 }
383 }
384 // Return info for requested (cached) frame
385 return frameMap.value(frameNumber);
386}
387
400{
402 time.start();
404 if (!info.isValid())
405 return false;
406 if (info.isEndMarker()) {
407 // We reached the end of the animation.
408 if (isFirstIteration) {
409 if (nextFrameNumber == 0) {
410 // No frames could be read at all (error).
411 return false;
412 }
413 // End of first iteration. Initialize play counter
415 isFirstIteration = false;
416 }
417 // Loop as appropriate
418 if (playCounter != 0) {
419 if (playCounter != -1) // Infinite?
420 playCounter--; // Nope
421 nextFrameNumber = 0;
422 return next();
423 }
424 // Loop no more. Done
425 return false;
426 }
427 // Image and delay OK, update internal state
429 QSize scaledSize = reader->scaledSize();
430 if (scaledSize.isValid() && (scaledSize != info.pixmap.size()))
431 currentPixmap = QPixmap::fromImage( info.pixmap.toImage().scaled(scaledSize) );
432 else
433 currentPixmap = info.pixmap;
434
435 if (!speed)
436 return true;
437
439 // Adjust delay according to the time it took to read the frame
440 int processingTime = time.elapsed();
441 if (processingTime > nextDelay)
442 nextDelay = 0;
443 else
444 nextDelay = nextDelay - processingTime;
445 return true;
446}
447
451{
452 _q_loadNextFrame(false);
453}
454
456{
457 Q_Q(QMovie);
458 if (next()) {
459 if (starting && movieState == QMovie::NotRunning) {
461 emit q->started();
462 }
463
464 if (frameRect.size() != currentPixmap.rect().size()) {
466 emit q->resized(frameRect.size());
467 }
468
469 emit q->updated(frameRect);
470 emit q->frameChanged(currentFrameNumber);
471
472 if (speed && movieState == QMovie::Running)
474 } else {
475 // Could not read another frame
476 if (!isDone()) {
477 emit q->error(reader->error());
478 }
479
480 // Graceful finish
481 if (movieState != QMovie::Paused) {
482 nextFrameNumber = 0;
483 isFirstIteration = true;
484 playCounter = -1;
486 emit q->finished();
487 }
488 }
489}
490
495{
496 Q_Q(const QMovie);
497
498 if (greatestFrameNumber >= 0)
499 return true; // have we seen valid data
500 bool canRead = reader->canRead();
501 if (!canRead) {
502 // let the consumer know it's broken
503 //
504 // ### the const_cast here is ugly, but 'const' of this method is
505 // technically wrong right now, since it may cause the underlying device
506 // to open.
507 emit const_cast<QMovie*>(q)->error(reader->error());
508 }
509 return canRead;
510}
511
515bool QMoviePrivate::jumpToFrame(int frameNumber)
516{
517 if (frameNumber < 0)
518 return false;
519 if (currentFrameNumber == frameNumber)
520 return true;
521 nextFrameNumber = frameNumber;
526}
527
532{
533 int result;
534 if ((result = reader->imageCount()) != 0)
535 return result;
536 if (haveReadAll)
537 return greatestFrameNumber+1;
538 return 0; // Don't know
539}
540
545{
547}
548
557{
558 Q_D(QMovie);
559 d->reader = new QImageReader;
560 connect(&d->nextImageTimer, SIGNAL(timeout()), this, SLOT(_q_loadNextFrame()));
561}
562
573{
574 Q_D(QMovie);
575 d->reader = new QImageReader(device, format);
576 d->initialDevicePos = device->pos();
577 connect(&d->nextImageTimer, SIGNAL(timeout()), this, SLOT(_q_loadNextFrame()));
578}
579
590{
591 Q_D(QMovie);
592 d->absoluteFilePath = QDir(fileName).absolutePath();
593 d->reader = new QImageReader(fileName, format);
594 if (d->reader->device())
595 d->initialDevicePos = d->reader->device()->pos();
596 connect(&d->nextImageTimer, SIGNAL(timeout()), this, SLOT(_q_loadNextFrame()));
597}
598
603{
604 Q_D(QMovie);
605 delete d->reader;
606}
607
615{
616 Q_D(QMovie);
617 d->reader->setDevice(device);
618 d->reset();
619}
620
628{
629 Q_D(const QMovie);
630 return d->reader->device();
631}
632
640{
641 Q_D(QMovie);
642 d->absoluteFilePath = QDir(fileName).absolutePath();
643 d->reader->setFileName(fileName);
644 d->reset();
645}
646
655{
656 Q_D(const QMovie);
657 return d->reader->fileName();
658}
659
671{
672 Q_D(QMovie);
673 d->reader->setFormat(format);
674}
675
683{
684 Q_D(const QMovie);
685 return d->reader->format();
686}
687
695{
696 Q_D(QMovie);
697 d->reader->setBackgroundColor(color);
698}
699
707{
708 Q_D(const QMovie);
709 return d->reader->backgroundColor();
710}
711
718{
719 Q_D(const QMovie);
720 return d->movieState;
721}
722
730{
731 Q_D(const QMovie);
732 return d->frameRect;
733}
734
741{
742 Q_D(const QMovie);
743 return d->currentPixmap;
744}
745
752{
753 Q_D(const QMovie);
754 return d->currentPixmap.toImage();
755}
756
763bool QMovie::isValid() const
764{
765 Q_D(const QMovie);
766 return d->isValid();
767}
768
775{
776 Q_D(const QMovie);
777 return d->reader->error();
778}
779
787{
788 Q_D(const QMovie);
789 return d->reader->errorString();
790}
791
799{
800 Q_D(const QMovie);
801 return d->frameCount();
802}
803
809{
810 Q_D(const QMovie);
811 return d->nextDelay;
812}
813
819{
820 Q_D(const QMovie);
821 return d->currentFrameNumber;
822}
823
828{
829 Q_D(QMovie);
830 return d->jumpToNextFrame();
831}
832
837bool QMovie::jumpToFrame(int frameNumber)
838{
839 Q_D(QMovie);
840 return d->jumpToFrame(frameNumber);
841}
842
853{
854 Q_D(const QMovie);
855 return d->reader->loopCount();
856}
857
865void QMovie::setPaused(bool paused)
866{
867 Q_D(QMovie);
868 if (paused) {
869 if (d->movieState == NotRunning)
870 return;
871 d->enterState(Paused);
872 d->nextImageTimer.stop();
873 } else {
874 if (d->movieState == Running)
875 return;
876 d->enterState(Running);
877 d->nextImageTimer.start(nextFrameDelay());
878 }
879}
880
891void QMovie::setSpeed(int percentSpeed)
892{
893 Q_D(QMovie);
894 if (!d->speed && d->movieState == Running)
895 d->nextImageTimer.start(nextFrameDelay());
896 if (percentSpeed != d->speed) {
897 d->speed = percentSpeed;
898 d->speed.notify();
899 } else {
900 d->speed.removeBindingUnlessInWrapper();
901 }
902}
903
904int QMovie::speed() const
905{
906 Q_D(const QMovie);
907 return d->speed;
908}
909
911{
912 Q_D(QMovie);
913 return &d->speed;
914}
915
927{
928 Q_D(QMovie);
929 if (d->movieState == NotRunning) {
930 d->_q_loadNextFrame(true);
931 } else if (d->movieState == Paused) {
932 setPaused(false);
933 }
934}
935
947{
948 Q_D(QMovie);
949 if (d->movieState == NotRunning)
950 return;
951 d->enterState(NotRunning);
952 d->nextImageTimer.stop();
953 d->nextFrameNumber = 0;
954}
955
964{
965 Q_D(QMovie);
966 return d->reader->scaledSize();
967}
968
977{
978 Q_D(QMovie);
979 d->reader->setScaledSize(size);
980}
981
990{
992
995
996 const auto doesntSupportAnimation =
997 [&buffer](const QByteArray &format) {
999 };
1000
1001 list.removeIf(doesntSupportAnimation);
1002 return list;
1003}
1004
1027{
1028 Q_D(const QMovie);
1029 return d->cacheMode;
1030}
1031
1033{
1034 Q_D(QMovie);
1035 d->cacheMode = cacheMode;
1036}
1037
1039{
1040 Q_D(QMovie);
1041 return &d->cacheMode;
1042}
1043
1045
1046#include "moc_qmovie.cpp"
IOBluetoothDevice * device
\inmodule QtCore
Definition qproperty.h:809
\inmodule QtCore \reentrant
Definition qbuffer.h:16
\inmodule QtCore
Definition qbytearray.h:57
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
\inmodule QtCore
Definition qdir.h:19
QString absolutePath() const
Returns the absolute path (a path that starts with "/" or with a drive specification),...
Definition qdir.cpp:667
\inmodule QtCore
qint64 size() const
Returns the file size in bytes.
bool isEndMarker()
Definition qmovie.cpp:182
QFrameInfo(bool endMark)
Definition qmovie.cpp:165
bool endMark
Definition qmovie.cpp:164
QPixmap pixmap
Definition qmovie.cpp:162
QFrameInfo(QPixmap &&pixmap, int delay)
Definition qmovie.cpp:173
static QFrameInfo endMarker()
Definition qmovie.cpp:185
bool isValid()
Definition qmovie.cpp:177
\inmodule QtCore \reentrant
Definition qiodevice.h:34
virtual qint64 pos() const
For random-access devices, this function returns the position that data is written to or read from.
virtual bool isSequential() const
Returns true if this device is sequential; otherwise returns false.
virtual bool seek(qint64 pos)
For random-access devices, this function sets the current position to pos, returning true on success,...
The QImageReader class provides a format independent interface for reading images from files or other...
int imageCount() const
For image formats that support animation, this function returns the total number of images in the ani...
QSize scaledSize() const
Returns the scaled size of the image.
QString fileName() const
If the currently assigned device is a QFile, or if setFileName() has been called, this function retur...
void setScaledSize(const QSize &size)
Sets the scaled size of the image to size.
ImageReaderError
This enum describes the different types of errors that can occur when reading images with QImageReade...
QIODevice * device() const
Returns the device currently assigned to QImageReader, or \nullptr if no device has been assigned.
QColor backgroundColor() const
bool jumpToImage(int imageNumber)
For image formats that support animation, this function skips to the image whose sequence number is i...
bool supportsOption(QImageIOHandler::ImageOption option) const
QByteArray format() const
Returns the format QImageReader uses for reading images.
bool canRead() const
Returns true if an image can be read for the device (i.e., the image format is supported,...
static QList< QByteArray > supportedImageFormats()
Returns the list of image formats supported by QImageReader.
void setBackgroundColor(const QColor &color)
ImageReaderError error() const
Returns the type of error that occurred last.
int nextImageDelay() const
For image formats that support animation, this function returns the number of milliseconds to wait un...
int loopCount() const
For image formats that support animation, this function returns the number of times the animation sho...
QImage read()
Reads an image from the device.
\inmodule QtGui
Definition qimage.h:37
bool isNull() const
Returns true if it is a null image, otherwise returns false.
Definition qimage.cpp:1197
Definition qlist.h:74
qsizetype removeIf(Predicate pred)
Definition qlist.h:587
Definition qmap.h:186
iterator insert(const Key &key, const T &value)
Definition qmap.h:687
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:356
void clear()
Definition qmap.h:288
int speedAdjustedDelay(int delay) const
Definition qmovie.cpp:279
QString absoluteFilePath
Definition qmovie.cpp:234
QTimer nextImageTimer
Definition qmovie.cpp:236
void _q_loadNextFrame()
Definition qmovie.cpp:450
QMovie::MovieState movieState
Definition qmovie.cpp:220
QPixmap currentPixmap
Definition qmovie.cpp:222
bool isDone()
Definition qmovie.cpp:266
int nextFrameNumber
Definition qmovie.cpp:224
QImageReader * reader
Definition qmovie.cpp:215
QFrameInfo infoForFrame(int frameNumber)
Definition qmovie.cpp:296
QMap< int, QFrameInfo > frameMap
Definition qmovie.cpp:233
qint64 initialDevicePos
Definition qmovie.cpp:228
void enterState(QMovie::MovieState newState)
Definition qmovie.cpp:206
void setSpeed(int percentSpeed)
Definition qmovie.cpp:217
int currentFrameNumber
Definition qmovie.cpp:223
bool isValid() const
Definition qmovie.cpp:494
void reset()
Definition qmovie.cpp:249
QRect frameRect
Definition qmovie.cpp:221
bool jumpToFrame(int frameNumber)
Definition qmovie.cpp:515
bool jumpToNextFrame()
Definition qmovie.cpp:544
bool next()
Definition qmovie.cpp:399
int frameCount() const
Definition qmovie.cpp:531
int greatestFrameNumber
Definition qmovie.cpp:225
bool isFirstIteration
Definition qmovie.cpp:232
\inmodule QtGui
Definition qmovie.h:28
QPixmap currentPixmap() const
Returns the current frame as a QPixmap.
Definition qmovie.cpp:740
MovieState state() const
Returns the current state of QMovie.
Definition qmovie.cpp:717
QImage currentImage() const
Returns the current frame as a QImage.
Definition qmovie.cpp:751
QBindable< CacheMode > bindableCacheMode()
Definition qmovie.cpp:1038
QColor backgroundColor() const
Returns the background color of the movie.
Definition qmovie.cpp:706
int currentFrameNumber() const
Returns the sequence number of the current frame.
Definition qmovie.cpp:818
QRect frameRect() const
Returns the rect of the last frame.
Definition qmovie.cpp:729
QImageReader::ImageReaderError lastError() const
Returns the most recent error that occurred while attempting to read image data.
Definition qmovie.cpp:774
QIODevice * device() const
Returns the device QMovie reads image data from.
Definition qmovie.cpp:627
MovieState
This enum describes the different states of QMovie.
Definition qmovie.h:34
@ Paused
Definition qmovie.h:36
@ Running
Definition qmovie.h:37
@ NotRunning
Definition qmovie.h:35
static QList< QByteArray > supportedFormats()
Definition qmovie.cpp:989
void setBackgroundColor(const QColor &color)
For image formats that support it, this function sets the background color to color.
Definition qmovie.cpp:694
~QMovie()
Destructs the QMovie object.
Definition qmovie.cpp:602
CacheMode
This enum describes the different cache modes of QMovie.
Definition qmovie.h:40
@ CacheNone
Definition qmovie.h:41
QSize scaledSize()
Definition qmovie.cpp:963
void setFileName(const QString &fileName)
Sets the name of the file that QMovie reads image data from, to fileName.
Definition qmovie.cpp:639
void start()
Starts the movie.
Definition qmovie.cpp:926
int speed
the movie's speed
Definition qmovie.h:31
int loopCount() const
Returns the number of times the movie will loop before it finishes.
Definition qmovie.cpp:852
QBindable< int > bindableSpeed()
Definition qmovie.cpp:910
int nextFrameDelay() const
Returns the number of milliseconds QMovie will wait before updating the next frame in the animation.
Definition qmovie.cpp:808
bool jumpToNextFrame()
Jumps to the next frame.
Definition qmovie.cpp:827
void stop()
Stops the movie.
Definition qmovie.cpp:946
CacheMode cacheMode
the movie's cache mode
Definition qmovie.h:32
QString fileName() const
Returns the name of the file that QMovie reads image data from.
Definition qmovie.cpp:654
void setSpeed(int percentSpeed)
Definition qmovie.cpp:891
void setDevice(QIODevice *device)
Sets the current device to device.
Definition qmovie.cpp:614
QMovie(QObject *parent=nullptr)
Constructs a QMovie object, passing the parent object to QObject's constructor.
Definition qmovie.cpp:555
bool jumpToFrame(int frameNumber)
Jumps to frame number frameNumber.
Definition qmovie.cpp:837
void setFormat(const QByteArray &format)
Sets the format that QMovie will use when decoding image data, to format.
Definition qmovie.cpp:670
void setScaledSize(const QSize &size)
Definition qmovie.cpp:976
QByteArray format() const
Returns the format that QMovie uses when decoding image data.
Definition qmovie.cpp:682
bool isValid() const
Returns true if the movie is valid (e.g., the image data is readable and the image format is supporte...
Definition qmovie.cpp:763
void setCacheMode(CacheMode mode)
Definition qmovie.cpp:1032
int frameCount() const
Returns the number of frames in the movie.
Definition qmovie.cpp:798
QString lastErrorString() const
Returns a human-readable representation of the most recent error that occurred while attempting to re...
Definition qmovie.cpp:786
void setPaused(bool paused)
If paused is true, QMovie will enter \l Paused state and emit stateChanged(Paused); otherwise it will...
Definition qmovie.cpp:865
QObject * q_ptr
Definition qobject.h:60
QObject * parent
Definition qobject.h:61
\inmodule QtCore
Definition qobject.h:90
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
Returns a copy of the pixmap that is transformed using the given transformation transform and transfo...
Definition qpixmap.h:27
bool isNull() const
Returns true if this is a null pixmap; otherwise returns false.
Definition qpixmap.cpp:460
QRect rect() const
Returns the pixmap's enclosing rectangle.
Definition qpixmap.cpp:509
static QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags=Qt::AutoColor)
Converts the given image to a pixmap using the specified flags to control the conversion.
Definition qpixmap.cpp:1445
\inmodule QtCore\reentrant
Definition qrect.h:30
constexpr QSize size() const noexcept
Returns the size of the rectangle.
Definition qrect.h:241
\inmodule QtCore
Definition qsize.h:25
constexpr bool isValid() const noexcept
Returns true if both the width and height is equal to or greater than 0; otherwise returns false.
Definition qsize.h:126
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qtimer.h:20
void setSingleShot(bool singleShot)
Definition qtimer.cpp:580
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
Definition qtimer.cpp:208
void stop()
Stops the timer.
Definition qtimer.cpp:226
#define this
Definition dialogs.cpp:9
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
#define QMOVIE_INVALID_DELAY
Definition qmovie.cpp:155
#define SLOT(a)
Definition qobjectdefs.h:51
#define SIGNAL(a)
Definition qobjectdefs.h:52
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLbitfield GLuint64 timeout
[4]
GLenum GLuint buffer
GLint GLsizei GLsizei GLenum format
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLuint64EXT * result
[6]
#define Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(...)
Definition qproperty.h:1264
#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
#define emit
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:145
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:163
long long qint64
Definition qtypes.h:55
QList< int > list
[14]
QFileInfo info(fileName)
[8]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent