aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qpixmap/tst_qpixmap.cpp28
-rw-r--r--tests/auto/qwinjumplist/tst_qwinjumplist.cpp8
-rw-r--r--tests/auto/qwinmime/tst_qwinmime.cpp4
-rw-r--r--tests/auto/qwintaskbarbutton/tst_qwintaskbarbutton.cpp4
-rw-r--r--tests/auto/qwinthumbnailtoolbar/tst_qwinthumbnailtoolbar.cpp10
-rw-r--r--tests/manual/dwmfeatures/testwidget.cpp11
-rw-r--r--tests/manual/dwmfeatures/testwidget.h6
-rw-r--r--tests/manual/imageconversion/imageconversion.pro5
-rw-r--r--tests/manual/imageconversion/main.cpp395
-rw-r--r--tests/manual/jumplist/main.cpp6
-rw-r--r--tests/manual/jumplist/testwidget.cpp2
-rw-r--r--tests/manual/manual.pro3
-rw-r--r--tests/manual/thumbnail/main.cpp2
13 files changed, 443 insertions, 41 deletions
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index 8383194..2791cd2 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -87,7 +87,7 @@ void tst_QPixmap::toHBITMAP()
const HBITMAP bitmap = QtWin::toHBITMAP(pm);
- QVERIFY(bitmap != 0);
+ QVERIFY(bitmap != nullptr);
// Verify size
BITMAP bitmapInfo;
@@ -98,10 +98,10 @@ void tst_QPixmap::toHBITMAP()
QCOMPARE(LONG(100), bitmapInfo.bmWidth);
QCOMPARE(LONG(100), bitmapInfo.bmHeight);
- const HDC displayDc = GetDC(0);
+ const HDC displayDc = GetDC(nullptr);
const HDC bitmapDc = CreateCompatibleDC(displayDc);
- const HBITMAP nullBitmap = static_cast<HBITMAP>(SelectObject(bitmapDc, bitmap));
+ const auto nullBitmap = static_cast<HBITMAP>(SelectObject(bitmapDc, bitmap));
const COLORREF pixel = GetPixel(bitmapDc, 0, 0);
QCOMPARE(int(GetRValue(pixel)), red);
@@ -112,7 +112,7 @@ void tst_QPixmap::toHBITMAP()
SelectObject(bitmapDc, nullBitmap);
DeleteObject(bitmap);
DeleteDC(bitmapDc);
- ReleaseDC(0, displayDc);
+ ReleaseDC(nullptr, displayDc);
}
void tst_QPixmap::fromHBITMAP_data()
@@ -126,7 +126,7 @@ void tst_QPixmap::fromHBITMAP()
QFETCH(int, green);
QFETCH(int, blue);
- const HDC displayDc = GetDC(0);
+ const HDC displayDc = GetDC(nullptr);
const HDC bitmapDc = CreateCompatibleDC(displayDc);
const HBITMAP bitmap = CreateCompatibleBitmap(displayDc, 100, 100);
SelectObject(bitmapDc, bitmap);
@@ -148,7 +148,7 @@ void tst_QPixmap::fromHBITMAP()
DeleteObject(SelectObject(bitmapDc, oldBrush));
DeleteObject(SelectObject(bitmapDc, bitmap));
DeleteDC(bitmapDc);
- ReleaseDC(0, displayDc);
+ ReleaseDC(nullptr, displayDc);
}
static bool compareImages(const QImage &actual, const QImage &expected,
@@ -221,20 +221,20 @@ void tst_QPixmap::toHICON()
QPixmap empty(width, height);
empty.fill(Qt::transparent);
- const HDC displayDc = GetDC(0);
+ const HDC displayDc = GetDC(nullptr);
const HDC bitmapDc = CreateCompatibleDC(displayDc);
const HBITMAP bitmap = QtWin::toHBITMAP(empty, QtWin::HBitmapAlpha);
SelectObject(bitmapDc, bitmap);
const QString imageFileName = pngFileName(image, width, height);
- QVERIFY2(QFileInfo(imageFileName).exists(), qPrintable(imageFileName));
+ QVERIFY2(QFileInfo::exists(imageFileName), qPrintable(imageFileName));
const QImage imageFromFile = QImage(imageFileName).convertToFormat(QImage::Format_ARGB32_Premultiplied);
QVERIFY(!imageFromFile.isNull());
const HICON icon = QtWin::toHICON(QPixmap::fromImage(imageFromFile));
- DrawIconEx(bitmapDc, 0, 0, icon, width, height, 0, 0, DI_NORMAL);
+ DrawIconEx(bitmapDc, 0, 0, icon, width, height, 0, nullptr, DI_NORMAL);
DestroyIcon(icon);
DeleteDC(bitmapDc);
@@ -242,7 +242,7 @@ void tst_QPixmap::toHICON()
const QImage imageFromHICON = QtWin::fromHBITMAP(bitmap, QtWin::HBitmapAlpha).toImage();
QVERIFY(!imageFromHICON.isNull());
- ReleaseDC(0, displayDc);
+ ReleaseDC(nullptr, displayDc);
// fuzzy comparison must be used, as the pixel values change slightly during conversion
// between QImage::Format_ARGB32 and QImage::Format_ARGB32_Premultiplied, or elsewhere
@@ -262,16 +262,16 @@ void tst_QPixmap::fromHICON()
QFETCH(QString, image);
const QString iconFileName = image + QStringLiteral(".ico");
- QVERIFY2(QFileInfo(iconFileName).exists(), qPrintable(iconFileName));
+ QVERIFY2(QFileInfo::exists(iconFileName), qPrintable(iconFileName));
- const HICON icon =
- static_cast<HICON>(LoadImage(0, reinterpret_cast<const wchar_t *>(iconFileName.utf16()),
+ const auto icon =
+ static_cast<HICON>(LoadImage(nullptr, reinterpret_cast<const wchar_t *>(iconFileName.utf16()),
IMAGE_ICON, width, height, LR_LOADFROMFILE));
const QImage imageFromHICON = QtWin::fromHICON(icon).toImage();
DestroyIcon(icon);
const QString imageFileName = pngFileName(image, width, height);
- QVERIFY2(QFileInfo(imageFileName).exists(), qPrintable(imageFileName));
+ QVERIFY2(QFileInfo::exists(imageFileName), qPrintable(imageFileName));
const QImage imageFromFile = QImage(imageFileName).convertToFormat(QImage::Format_ARGB32_Premultiplied);
QVERIFY(!imageFromFile.isNull());
diff --git a/tests/auto/qwinjumplist/tst_qwinjumplist.cpp b/tests/auto/qwinjumplist/tst_qwinjumplist.cpp
index 40d6b04..52b1ee5 100644
--- a/tests/auto/qwinjumplist/tst_qwinjumplist.cpp
+++ b/tests/auto/qwinjumplist/tst_qwinjumplist.cpp
@@ -67,7 +67,7 @@ void tst_QWinJumpList::testRecent()
recent1->clear();
QVERIFY(recent1->isEmpty());
- recent1->addItem(0);
+ recent1->addItem(nullptr);
QVERIFY(recent1->isEmpty());
recent1->setVisible(true);
@@ -116,7 +116,7 @@ void tst_QWinJumpList::testFrequent()
frequent1->clear();
QVERIFY(frequent1->isEmpty());
- frequent1->addItem(0);
+ frequent1->addItem(nullptr);
QVERIFY(frequent1->isEmpty());
frequent1->setVisible(true);
@@ -164,7 +164,7 @@ void tst_QWinJumpList::testTasks()
tasks->setVisible(true);
QVERIFY(tasks->isVisible());
- tasks->addItem(0);
+ tasks->addItem(nullptr);
QVERIFY(tasks->isEmpty());
QWinJumpListItem* link1 = tasks->addLink(QStringLiteral("tst_QWinJumpList"), QCoreApplication::applicationFilePath());
@@ -203,7 +203,7 @@ void tst_QWinJumpList::testCategories()
QWinJumpList jumplist;
QVERIFY(jumplist.categories().isEmpty());
- jumplist.addCategory(0);
+ jumplist.addCategory(nullptr);
QWinJumpListCategory *cat1 = new QWinJumpListCategory(QStringLiteral("tmp"));
QCOMPARE(cat1->title(), QStringLiteral("tmp"));
diff --git a/tests/auto/qwinmime/tst_qwinmime.cpp b/tests/auto/qwinmime/tst_qwinmime.cpp
index 666f292..0c57de4 100644
--- a/tests/auto/qwinmime/tst_qwinmime.cpp
+++ b/tests/auto/qwinmime/tst_qwinmime.cpp
@@ -36,7 +36,7 @@
class TestMime : public QWinMime
{
public:
- TestMime(bool verbose = false) : formatsForMimeCalled(false), m_verbose(verbose) {}
+ TestMime(bool verbose = false) : m_verbose(verbose) {}
bool canConvertFromMime(const FORMATETC &, const QMimeData *mimeData) const Q_DECL_OVERRIDE
{
@@ -81,7 +81,7 @@ public:
return QString();
}
- mutable bool formatsForMimeCalled;
+ mutable bool formatsForMimeCalled = false;
private:
const bool m_verbose;
diff --git a/tests/auto/qwintaskbarbutton/tst_qwintaskbarbutton.cpp b/tests/auto/qwintaskbarbutton/tst_qwintaskbarbutton.cpp
index 82c93f9..a9287a0 100644
--- a/tests/auto/qwintaskbarbutton/tst_qwintaskbarbutton.cpp
+++ b/tests/auto/qwintaskbarbutton/tst_qwintaskbarbutton.cpp
@@ -50,9 +50,9 @@ void tst_QWinTaskbarButton::testWindow()
btn1.setWindow(&window);
QCOMPARE(btn1.window(), &window);
- QWinTaskbarButton *btn2 = new QWinTaskbarButton(&window);
+ auto *btn2 = new QWinTaskbarButton(&window);
QCOMPARE(btn2->window(), &window);
- btn2->setWindow(0);
+ btn2->setWindow(nullptr);
QVERIFY(!btn2->window());
}
diff --git a/tests/auto/qwinthumbnailtoolbar/tst_qwinthumbnailtoolbar.cpp b/tests/auto/qwinthumbnailtoolbar/tst_qwinthumbnailtoolbar.cpp
index d5a722a..fc53a24 100644
--- a/tests/auto/qwinthumbnailtoolbar/tst_qwinthumbnailtoolbar.cpp
+++ b/tests/auto/qwinthumbnailtoolbar/tst_qwinthumbnailtoolbar.cpp
@@ -48,9 +48,9 @@ void tst_QWinThumbnailToolBar::testWindow()
tbar1.setWindow(&window);
QCOMPARE(tbar1.window(), &window);
- QWinThumbnailToolBar *tbar2 = new QWinThumbnailToolBar(&window);
+ auto *tbar2 = new QWinThumbnailToolBar(&window);
QCOMPARE(tbar2->window(), &window);
- tbar2->setWindow(0);
+ tbar2->setWindow(nullptr);
QVERIFY(!tbar2->window());
}
@@ -60,12 +60,12 @@ void tst_QWinThumbnailToolBar::testButtons()
QCOMPARE(tbar.count(), 0);
QVERIFY(tbar.buttons().isEmpty());
- tbar.addButton(0);
+ tbar.addButton(nullptr);
QCOMPARE(tbar.count(), 0);
QVERIFY(tbar.buttons().isEmpty());
- QWinThumbnailToolButton *btn1 = new QWinThumbnailToolButton;
- QWinThumbnailToolButton *btn2 = new QWinThumbnailToolButton;
+ auto *btn1 = new QWinThumbnailToolButton;
+ auto *btn2 = new QWinThumbnailToolButton;
tbar.addButton(btn1);
QCOMPARE(tbar.count(), 1);
diff --git a/tests/manual/dwmfeatures/testwidget.cpp b/tests/manual/dwmfeatures/testwidget.cpp
index 42f1f37..09b25ac 100644
--- a/tests/manual/dwmfeatures/testwidget.cpp
+++ b/tests/manual/dwmfeatures/testwidget.cpp
@@ -46,14 +46,13 @@ TestWidget::TestWidget(QWidget *parent) :
connect(ui->radioFlipAbove, &QAbstractButton::clicked, this, &TestWidget::onFlip3DPolicyChanged);
connect(ui->radioFlipBelow, &QAbstractButton::clicked, this, &TestWidget::onFlip3DPolicyChanged);
connect(ui->btnFrameReset, &QAbstractButton::clicked, this, &TestWidget::onResetGlassFrameClicked);
- typedef void(QSpinBox::*IntSignal)(int);
- connect(ui->frameTop, static_cast<IntSignal>(&QSpinBox::valueChanged),
+ connect(ui->frameTop, QOverload<int>::of(&QSpinBox::valueChanged),
this, &TestWidget::onGlassMarginsChanged);
- connect(ui->frameRight, static_cast<IntSignal>(&QSpinBox::valueChanged),
+ connect(ui->frameRight, QOverload<int>::of(&QSpinBox::valueChanged),
this, &TestWidget::onGlassMarginsChanged);
- connect(ui->frameBottom, static_cast<IntSignal>(&QSpinBox::valueChanged),
+ connect(ui->frameBottom, QOverload<int>::of(&QSpinBox::valueChanged),
this, &TestWidget::onGlassMarginsChanged);
- connect(ui->frameLeft, static_cast<IntSignal>(&QSpinBox::valueChanged),
+ connect(ui->frameLeft, QOverload<int>::of(&QSpinBox::valueChanged),
this, &TestWidget::onGlassMarginsChanged);
}
@@ -77,7 +76,7 @@ void TestWidget::changeEvent(QEvent *e)
bool TestWidget::event(QEvent *e)
{
if (e->type() == QWinEvent::CompositionChange) {
- QWinCompositionChangeEvent *event = static_cast<QWinCompositionChangeEvent *>(e);
+ auto *event = static_cast<QWinCompositionChangeEvent *>(e);
qDebug() << "Composition state change: " << event->isCompositionEnabled();
} else if (e->type() == QWinEvent::ThemeChange) {
qDebug() << "Theme change.";
diff --git a/tests/manual/dwmfeatures/testwidget.h b/tests/manual/dwmfeatures/testwidget.h
index 50dec4e..137e8ce 100644
--- a/tests/manual/dwmfeatures/testwidget.h
+++ b/tests/manual/dwmfeatures/testwidget.h
@@ -46,12 +46,12 @@ class TestWidget : public QWidget
Q_OBJECT
public:
- explicit TestWidget(QWidget *parent = 0);
+ explicit TestWidget(QWidget *parent = nullptr);
~TestWidget();
protected:
- void changeEvent(QEvent *e);
- bool event(QEvent *);
+ void changeEvent(QEvent *e) override;
+ bool event(QEvent *) override;
private:
Ui::TestWidget *ui;
diff --git a/tests/manual/imageconversion/imageconversion.pro b/tests/manual/imageconversion/imageconversion.pro
new file mode 100644
index 0000000..3442e28
--- /dev/null
+++ b/tests/manual/imageconversion/imageconversion.pro
@@ -0,0 +1,5 @@
+CONFIG += console c++11
+QT += widgets winextras
+TEMPLATE = app
+SOURCES += main.cpp
+LIBS += -luser32 -lgdi32
diff --git a/tests/manual/imageconversion/main.cpp b/tests/manual/imageconversion/main.cpp
new file mode 100644
index 0000000..def9cdb
--- /dev/null
+++ b/tests/manual/imageconversion/main.cpp
@@ -0,0 +1,395 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtWinExtras/QtWin>
+
+#include <QtWidgets/QAction>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QDialogButtonBox>
+#include <QtWidgets/QFileDialog>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QMainWindow>
+#include <QtWidgets/QMenu>
+#include <QtWidgets/QMenuBar>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QShortcut>
+#include <QtWidgets/QVBoxLayout>
+
+#include <QtGui/QImage>
+#include <QtGui/QPainter>
+#include <QtGui/QPaintEvent>
+
+#include <QtCore/QCommandLineOption>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QDebug>
+#include <QtCore/QTimer>
+#include <QtCore/qt_windows.h>
+
+static void formatData(QDebug d, const void *data, int size)
+{
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "\nData: " << QByteArray(reinterpret_cast<const char *>(data), qMin(20, size)).toHex();
+ if (size > 20)
+ d << "...";
+ d << "\n 0000000011111111222222223333333344444444";
+}
+
+QDebug operator<<(QDebug d, const BITMAP &b)
+{
+ QDebugStateSaver saver(d);
+ d.nospace();
+ d << "BITMAP(type=" << b.bmType << ", " << b.bmWidth << 'x' << b.bmHeight
+ << ", widthBytes=" << b.bmWidthBytes << ", planes=" << b.bmPlanes
+ << ", bitsPixel=" << b.bmBitsPixel << ", bits=" << b.bmBits << ')';
+ return d;
+}
+
+QDebug operator<<(QDebug d, const BITMAPINFOHEADER &bih)
+{
+ QDebugStateSaver saver(d);
+ d.nospace();
+ d << "BITMAPINFOHEADER(" << bih.biWidth << 'x' << qAbs(bih.biHeight)
+ << (bih.biHeight < 0 ? ", top-down" : ", bottom-up")
+ << ", planes=" << bih.biPlanes << ", bitCount=" << bih.biBitCount
+ << ", compression=" << bih.biCompression << ", size="
+ << bih.biSizeImage << ')';
+ return d;
+}
+
+static void formatImage(QDebug d, const QImage &image)
+{
+ QDebugStateSaver s(d);
+ d.noquote();
+ d.nospace();
+ d << image;
+ if (const int colorTableSize = image.colorCount()) {
+ QVector<QRgb> colorTable = image.colorTable();
+ d << " Color table: " << colorTableSize << " (" << showbase << hex; // 256 by standard
+ int c = 0;
+ for ( ; c < qMin(8, colorTableSize); ++c) {
+ if (c)
+ d << ", ";
+ d << colorTable[c];
+ }
+ if (c < colorTableSize)
+ d << "...";
+ d << ')' << noshowbase << dec;
+ }
+ formatData(d, image.constBits(), image.byteCount());
+}
+
+enum ParseOptionResult {
+ OptionError,
+ OptionUnset,
+ OptionSet
+};
+
+static ParseOptionResult parseIntOption(const QCommandLineParser &parser, const QCommandLineOption &option,
+ int minValue, int maxValue, int *target)
+{
+ if (!parser.isSet(option))
+ return OptionUnset;
+
+ const QString spec = parser.value(option);
+ bool ok;
+ const int value = spec.toInt(&ok);
+ if (!ok || value < minValue || value > maxValue) {
+ qWarning() << "Invalid value" << spec << "for" << option.names();
+ return OptionError;
+ }
+ *target = value;
+ return OptionSet;
+}
+
+template <typename Enum>
+static ParseOptionResult parseEnumOption(const QCommandLineParser &parser, const QCommandLineOption &option,
+ Enum minValue, Enum maxValue, Enum *target)
+{
+ int intValue;
+ const ParseOptionResult result = parseIntOption(parser, option, int(minValue), int(maxValue), &intValue);
+ if (result == OptionSet)
+ *target = static_cast<Enum>(intValue);
+ return result;
+}
+
+// Display a QImage in a dialog.
+class PreviewDialog : public QDialog
+{
+public:
+ explicit PreviewDialog(const QImage &image, QWidget *parent = nullptr);
+};
+
+PreviewDialog::PreviewDialog(const QImage &image, QWidget *parent) : QDialog(parent)
+{
+ setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
+ QString description;
+ QDebug(&description) << image.size() << ", format=" << image.format();
+ QLabel *descriptionLabel = new QLabel(description, this);
+ descriptionLabel->setWordWrap(true);
+ auto *layout = new QVBoxLayout(this);
+ layout->addWidget(descriptionLabel);
+ auto *hLayout = new QHBoxLayout;
+ QLabel *label = new QLabel(this);
+ label->setFrameShape(QFrame::Box);
+ label->setPixmap(QPixmap::fromImage(image));
+ hLayout->addStretch();
+ hLayout->addWidget(label);
+ hLayout->addStretch();
+ layout->addLayout(hLayout);
+ QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this);
+ connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
+ layout->addWidget(buttonBox);
+}
+
+// Widget that paints a HBITMAP using GDI API in WM_PAINT.
+class PaintWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit PaintWidget(HBITMAP hBitmap, QWidget *p = nullptr) : QWidget(p), m_hBitmap(hBitmap) { }
+
+ bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
+
+public slots:
+ void saveBitmap();
+ void convertBack();
+
+protected:
+ void contextMenuEvent(QContextMenuEvent *) override;
+
+private:
+ const HBITMAP m_hBitmap;
+};
+
+bool PaintWidget::nativeEvent(const QByteArray &eventType, void *messageIn, long *result)
+{
+ MSG *message = reinterpret_cast<MSG *>(messageIn);
+ if (message->message != WM_PAINT)
+ return QWidget::nativeEvent(eventType, message, result);
+
+ PAINTSTRUCT paintStruct;
+ BITMAP bitmap;
+
+ const HDC hdc = BeginPaint(message->hwnd, &paintStruct);
+ SelectObject(hdc, GetStockObject(BLACK_PEN));
+ Rectangle(hdc, 1, 1, width() - 1, height() - 1);
+
+ const HDC hdcMem = CreateCompatibleDC(hdc);
+ const HGDIOBJ oldBitmap = SelectObject(hdcMem, m_hBitmap);
+
+ GetObject(m_hBitmap, sizeof(bitmap), &bitmap);
+ {
+ QDebug d = qDebug();
+ d << __FUNCTION__ << bitmap;
+ formatData(d, bitmap.bmBits, bitmap.bmHeight * bitmap.bmWidthBytes);
+ }
+ BitBlt(hdc, 5, 5, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
+ SelectObject(hdcMem, oldBitmap);
+ DeleteDC(hdcMem);
+
+ EndPaint(message->hwnd, &paintStruct);
+ return true;
+}
+
+void PaintWidget::convertBack()
+{
+ QImage image = QtWin::imageFromHBITMAP(m_hBitmap);
+ formatImage(qDebug(), image);
+ auto *dialog = new PreviewDialog(image, this);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->setModal(false);
+ dialog->setWindowTitle(QLatin1String("QImage - Qt ") + QLatin1String(QT_VERSION_STR));
+ dialog->show();
+}
+
+void PaintWidget::saveBitmap()
+{
+ QImage image = QtWin::imageFromHBITMAP(m_hBitmap);
+ formatImage(qDebug(), image);
+ QFileDialog fileDialog(this);
+ fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+ fileDialog.setMimeTypeFilters(QStringList(QStringLiteral("image/png")));
+ fileDialog.setDefaultSuffix(QStringLiteral("png"));
+ fileDialog.selectFile(QStringLiteral("test.png"));
+ while (fileDialog.exec() == QDialog::Accepted) {
+ const QString fileName = fileDialog.selectedFiles().first();
+ if (image.save(fileName)) {
+ qDebug().noquote() << "saved" << QDir::toNativeSeparators(fileName);
+ break;
+ }
+ qWarning().noquote() << "Could not save" << QDir::toNativeSeparators(fileName);
+ }
+}
+
+void PaintWidget::contextMenuEvent(QContextMenuEvent *e)
+{
+ QMenu contextMenu;
+ contextMenu.addAction(QStringLiteral("Convert into QImage"), this, &PaintWidget::convertBack);
+ QAction *saveAction = contextMenu.addAction(QStringLiteral("Save"), this, &PaintWidget::saveBitmap);
+ saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
+ contextMenu.exec(e->globalPos());
+}
+
+static const char description[] =
+"\nCreates a HBITMAP from a QImage either passed as file name or by drawing in a\n"
+"format determined by a command line option and draws it onto a native window\n"
+"for comparison. Provides a context menu for converting the HBITMAP back to a\n"
+"QImage and saving that for checking the reverse conversion.";
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ QCoreApplication::setApplicationName("imageconversion");
+ QCoreApplication::setOrganizationName("QtProject");
+ QCoreApplication::setApplicationVersion(QT_VERSION_STR);
+ QCommandLineParser parser;
+ parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
+ parser.setApplicationDescription("Qt Windows Extras Image Conversion Tester");
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.setApplicationDescription(description);
+
+ const QCommandLineOption formatOption(QStringList{"format", "f"},
+ "QImage format", "format");
+ parser.addOption(formatOption);
+ const QCommandLineOption colorOption(QStringList{"color", "c"},
+ "Fill color", "color-spec");
+ parser.addOption(colorOption);
+ const QCommandLineOption globalColorOption(QStringList{"globalColor", "g"},
+ "Fill color (global color enum value)", "global-color");
+ parser.addOption(globalColorOption);
+ const QCommandLineOption widthOption(QStringList{"width", "w"},
+ "Width", "width");
+ parser.addOption(widthOption);
+ const QCommandLineOption heightOption(QStringList{"height", "h"},
+ "Height", "height");
+ parser.addOption(heightOption);
+ const QCommandLineOption previewOption(QStringList{"preview", "p"},
+ "Show a preview");
+ parser.addOption(previewOption);
+
+ parser.addPositionalArgument("file", "The image file to open.");
+ parser.process(app);
+
+ QColor defaultColor(Qt::red);
+ if (parser.isSet(colorOption)) {
+ const QString spec = parser.value(colorOption);
+ defaultColor = QColor(spec);
+ if (!defaultColor.isValid()) {
+ qWarning() << "Invalid color specification" << spec;
+ return -1;
+ }
+ } else {
+ // Color 0: color0, 1: color1, 2: black, 3: white, 7:red, 9: blue, 8: green
+ Qt::GlobalColor globalColor = Qt::color0;
+ if (!parseEnumOption(parser, globalColorOption, Qt::black, Qt::transparent, &globalColor))
+ return -1;
+ if (globalColor != Qt::color0)
+ defaultColor = QColor(defaultColor);
+ }
+
+ // Format: 1: mono, 3: Indexed8, 7: RGB 16, 11: RGB555, 13: RGB888
+ QImage::Format targetFormat = QImage::Format_ARGB32_Premultiplied;
+ if (!parseEnumOption(parser, formatOption, QImage::Format_Mono, QImage::Format_Grayscale8, &targetFormat))
+ return -1;
+ // Can't paint on indexed nor mono, need transform?
+ const QImage::Format drawFormat = targetFormat == QImage::Format_Indexed8
+ || targetFormat == QImage::Format_Mono || targetFormat == QImage::Format_MonoLSB
+ ? QImage::Format_ARGB32_Premultiplied : targetFormat;
+
+ if (targetFormat == QImage::Format_Mono || targetFormat == QImage::Format_MonoLSB)
+ defaultColor = Qt::white;
+
+ int width = 73;
+ int height = 57;
+ if (!parseIntOption(parser, widthOption, 1, 2000, &width) || !parseIntOption(parser, heightOption, 1, 2000, &height))
+ return -1;
+
+ const bool preview = parser.isSet(previewOption);
+
+ QImage image;
+ if (!parser.positionalArguments().isEmpty()) {
+ QString fileName = parser.positionalArguments().constFirst();
+ image = QImage(fileName);
+ if (image.isNull() || image.size().isEmpty()) {
+ qWarning().noquote() << "Image load fail" << QDir::toNativeSeparators(fileName);
+ return -1;
+ }
+ }
+
+ if (image.isNull()) {
+ qDebug() << "Default image color=" << defaultColor
+ << showbase << hex << defaultColor.rgba() << noshowbase << dec
+ << ", format=" << drawFormat;
+ image = QImage(width, height, drawFormat);
+ image.fill(defaultColor);
+ QPainter painter(&image);
+ painter.drawLine(0, 0, image.width(), image.height());
+ }
+
+ if (image.format() != targetFormat) {
+ qDebug() << "Converting " << image.format() << targetFormat;
+ image = image.convertToFormat(targetFormat);
+ }
+
+ formatImage(qDebug(), image);
+
+ const HBITMAP bitmap = QtWin::imageToHBITMAP(image);
+ if (!bitmap) {
+ qWarning() << "Failed to create HBITMAP";
+ return -1;
+ }
+
+ int exitCode = 0;
+ {
+ PaintWidget paintWidget(bitmap);
+ auto *quitShortcut = new QShortcut(&paintWidget);
+ quitShortcut->setKey(Qt::CTRL + Qt::Key_Q);
+ quitShortcut->setContext(Qt::ApplicationShortcut);
+ QObject::connect(quitShortcut, &QShortcut::activated, qApp, &QCoreApplication::quit);
+ paintWidget.setWindowTitle(QLatin1String("HBITMAP - Qt ") + QLatin1String(QT_VERSION_STR));
+ paintWidget.show();
+ if (preview) {
+ auto *dialog = new PreviewDialog(image);
+ dialog->setModal(false);
+ dialog->setWindowTitle(QLatin1String("QImage - Qt ") + QLatin1String(QT_VERSION_STR));
+ dialog->move(paintWidget.frameGeometry().topRight() + QPoint(50, 0));
+ dialog->show();
+ }
+ exitCode = app.exec();
+ }
+
+ DeleteObject(bitmap);
+
+ return exitCode;
+}
+
+#include "main.moc"
diff --git a/tests/manual/jumplist/main.cpp b/tests/manual/jumplist/main.cpp
index 0597fe5..5447187 100644
--- a/tests/manual/jumplist/main.cpp
+++ b/tests/manual/jumplist/main.cpp
@@ -51,8 +51,10 @@ static bool associateFileType()
regApplications.beginGroup("SupportedTypes");
QMimeDatabase mimeDatabase;
- foreach (const QString &t, TestWidget::supportedMimeTypes()) {
- foreach (const QString &s, mimeDatabase.mimeTypeForName(t).suffixes())
+ const auto types = TestWidget::supportedMimeTypes();
+ for (const QString &t : types) {
+ const auto suffixes = mimeDatabase.mimeTypeForName(t).suffixes();
+ for (const QString &s : suffixes)
regApplications.setValue('.' + s, QString());
}
regApplications.endGroup();
diff --git a/tests/manual/jumplist/testwidget.cpp b/tests/manual/jumplist/testwidget.cpp
index cbe8a3d..0928c59 100644
--- a/tests/manual/jumplist/testwidget.cpp
+++ b/tests/manual/jumplist/testwidget.cpp
@@ -105,7 +105,7 @@ void TestWidget::updateJumpList()
jumplist.recent()->setVisible(ui->cbShowRecent->isChecked());
jumplist.frequent()->setVisible(ui->cbShowFrequent->isChecked());
if (ui->cbRunFullscreen->isChecked()) {
- QWinJumpListItem *item = new QWinJumpListItem(QWinJumpListItem::Link);
+ auto *item = new QWinJumpListItem(QWinJumpListItem::Link);
item->setTitle(ui->cbRunFullscreen->text());
item->setFilePath(applicationBinary);
item->setArguments(QStringList("-fullscreen"));
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 4ff3a0b..be1698c 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -3,5 +3,6 @@ qtHaveModule(widgets) {
SUBDIRS += \
dwmfeatures \
jumplist \
- thumbnail
+ thumbnail \
+ imageconversion
}
diff --git a/tests/manual/thumbnail/main.cpp b/tests/manual/thumbnail/main.cpp
index 99096ec..009662f 100644
--- a/tests/manual/thumbnail/main.cpp
+++ b/tests/manual/thumbnail/main.cpp
@@ -104,7 +104,7 @@ MainWindow::MainWindow()
void MainWindow::initThumbnailToolBar()
{
m_thumbnailToolBar->setWindow(windowHandle());
- QWinThumbnailToolButton *testButton = new QWinThumbnailToolButton(m_thumbnailToolBar);
+ auto *testButton = new QWinThumbnailToolButton(m_thumbnailToolBar);
testButton->setToolTip("Test");
testButton->setIcon(style()->standardIcon(QStyle::SP_ComputerIcon));
connect(testButton, &QWinThumbnailToolButton::clicked, this, &MainWindow::testButtonClicked);