6.5.3 clean

This commit is contained in:
kleuter
2023-11-01 18:02:52 +01:00
parent bbe896803b
commit 7018d9e6c8
2170 changed files with 57471 additions and 43550 deletions

View File

@ -11,8 +11,4 @@ qt_internal_add_example(undoframework)
if(QT_FEATURE_library)
qt_internal_add_example(echoplugin)
if(QT_FEATURE_inputdialog)
qt_internal_add_example(plugandpaint)
endif()
endif()

View File

@ -7,8 +7,6 @@
//! [0]
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(completer);
QApplication app(argc, argv);
MainWindow window;
window.show();

View File

@ -7,8 +7,6 @@
//! [0]
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(customcompleter);
QApplication app(argc, argv);
MainWindow window;
window.show();

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(plugandpaint LANGUAGES CXX)
project(echoplugin LANGUAGES CXX)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")

View File

@ -1,18 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(plugandpaint LANGUAGES CXX)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tools/plugandpaint")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
qt_standard_project_setup()
add_subdirectory(plugins)
add_subdirectory(app)

View File

@ -1,36 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_add_executable(plugandpaint
interfaces.h
main.cpp
mainwindow.cpp mainwindow.h
paintarea.cpp paintarea.h
plugindialog.cpp plugindialog.h
)
set_target_properties(plugandpaint PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(plugandpaint PRIVATE
Qt6::Widgets
pnp_basictools
)
if(QT6_IS_SHARED_LIBS_BUILD)
# Build the shared plugin too when building this example target.
add_dependencies(plugandpaint pnp_extrafilters)
else()
# Link the extrafilters plugin if Qt is built statically.
target_link_libraries(plugandpaint PRIVATE
pnp_extrafilters
)
endif()
install(TARGETS plugandpaint
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,37 +0,0 @@
#! [0]
TARGET = plugandpaint
DESTDIR = ..
QT += widgets
HEADERS = interfaces.h \
mainwindow.h \
paintarea.h \
plugindialog.h
SOURCES = main.cpp \
mainwindow.cpp \
paintarea.cpp \
plugindialog.cpp
LIBS = -L../plugins
macx-xcode {
LIBS += -lpnp_basictools$($${QMAKE_XCODE_LIBRARY_SUFFIX_SETTING})
} else {
android {
LIBS += -lpnp_basictools_$${QT_ARCH}
} else {
LIBS += -lpnp_basictools
}
if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
mac:LIBS = $$member(LIBS, 0) $$member(LIBS, 1)_debug
win32:LIBS = $$member(LIBS, 0) $$member(LIBS, 1)d
}
}
#! [0]
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/plugandpaint
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!

View File

@ -1,76 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef INTERFACES_H
#define INTERFACES_H
#include <QtPlugin>
QT_BEGIN_NAMESPACE
class QImage;
class QPainter;
class QWidget;
class QPainterPath;
class QPoint;
class QRect;
class QString;
QT_END_NAMESPACE
//! [0]
class BrushInterface
{
public:
virtual ~BrushInterface() = default;
virtual QStringList brushes() const = 0;
virtual QRect mousePress(const QString &brush, QPainter &painter,
const QPoint &pos) = 0;
virtual QRect mouseMove(const QString &brush, QPainter &painter,
const QPoint &oldPos, const QPoint &newPos) = 0;
virtual QRect mouseRelease(const QString &brush, QPainter &painter,
const QPoint &pos) = 0;
};
//! [0]
//! [1]
class ShapeInterface
{
public:
virtual ~ShapeInterface() = default;
virtual QStringList shapes() const = 0;
virtual QPainterPath generateShape(const QString &shape,
QWidget *parent) = 0;
};
//! [1]
//! [2]
class FilterInterface
{
public:
virtual ~FilterInterface() = default;
virtual QStringList filters() const = 0;
virtual QImage filterImage(const QString &filter, const QImage &image,
QWidget *parent) = 0;
};
//! [2]
QT_BEGIN_NAMESPACE
//! [3] //! [4]
#define BrushInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface/1.0"
Q_DECLARE_INTERFACE(BrushInterface, BrushInterface_iid)
//! [3]
#define ShapeInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.ShapeInterface/1.0"
Q_DECLARE_INTERFACE(ShapeInterface, ShapeInterface_iid)
//! [5]
#define FilterInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.FilterInterface/1.0"
Q_DECLARE_INTERFACE(FilterInterface, FilterInterface_iid)
//! [4] //! [5]
QT_END_NAMESPACE
#endif

View File

@ -1,19 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
#include "mainwindow.h"
#include <QApplication>
#include <QtPlugin>
Q_IMPORT_PLUGIN(BasicToolsPlugin)
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
//! [0]

View File

@ -1,282 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "mainwindow.h"
#include "interfaces.h"
#include "paintarea.h"
#include "plugindialog.h"
#include <QAction>
#include <QActionGroup>
#include <QApplication>
#include <QColorDialog>
#include <QFileDialog>
#include <QInputDialog>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QPluginLoader>
#include <QScrollArea>
#include <QTimer>
MainWindow::MainWindow() : paintArea(new PaintArea)
, scrollArea(new QScrollArea)
{
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(paintArea);
setCentralWidget(scrollArea);
createActions();
createMenus();
loadPlugins();
setWindowTitle(tr("Plug & Paint"));
if (!brushActionGroup->actions().isEmpty())
brushActionGroup->actions().first()->trigger();
QTimer::singleShot(500, this, &MainWindow::aboutPlugins);
}
void MainWindow::open()
{
const QString fileName = QFileDialog::getOpenFileName(this,
tr("Open File"),
QDir::currentPath());
if (!fileName.isEmpty()) {
if (!paintArea->openImage(fileName)) {
QMessageBox::information(this, tr("Plug & Paint"),
tr("Cannot load %1.").arg(fileName));
return;
}
paintArea->adjustSize();
}
}
bool MainWindow::saveAs()
{
const QString initialPath = QDir::currentPath() + "/untitled.png";
const QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
initialPath);
if (fileName.isEmpty())
return false;
return paintArea->saveImage(fileName, "png");
}
void MainWindow::brushColor()
{
const QColor newColor = QColorDialog::getColor(paintArea->brushColor());
if (newColor.isValid())
paintArea->setBrushColor(newColor);
}
void MainWindow::brushWidth()
{
bool ok;
const int newWidth = QInputDialog::getInt(this, tr("Plug & Paint"),
tr("Select brush width:"),
paintArea->brushWidth(),
1, 50, 1, &ok);
if (ok)
paintArea->setBrushWidth(newWidth);
}
//! [0]
void MainWindow::changeBrush()
{
auto action = qobject_cast<QAction *>(sender());
if (!action)
return;
auto iBrush = qobject_cast<BrushInterface *>(action->parent());
if (!iBrush)
return;
const QString brush = action->text();
paintArea->setBrush(iBrush, brush);
}
//! [0]
//! [1]
void MainWindow::insertShape()
{
auto action = qobject_cast<QAction *>(sender());
if (!action)
return;
auto iShape = qobject_cast<ShapeInterface *>(action->parent());
if (!iShape)
return;
const QPainterPath path = iShape->generateShape(action->text(), this);
if (!path.isEmpty())
paintArea->insertShape(path);
}
//! [1]
//! [2]
void MainWindow::applyFilter()
{
auto action = qobject_cast<QAction *>(sender());
if (!action)
return;
auto iFilter = qobject_cast<FilterInterface *>(action->parent());
if (!iFilter)
return;
const QImage image = iFilter->filterImage(action->text(), paintArea->image(),
this);
paintArea->setImage(image);
}
//! [2]
void MainWindow::about()
{
QMessageBox::about(this, tr("About Plug & Paint"),
tr("The <b>Plug & Paint</b> example demonstrates how to write Qt "
"applications that can be extended through plugins."));
}
//! [3]
void MainWindow::aboutPlugins()
{
PluginDialog dialog(pluginsDir.path(), pluginFileNames, this);
dialog.exec();
}
//! [3]
void MainWindow::createActions()
{
openAct = new QAction(tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
connect(openAct, &QAction::triggered, this, &MainWindow::open);
saveAsAct = new QAction(tr("&Save As..."), this);
saveAsAct->setShortcuts(QKeySequence::SaveAs);
connect(saveAsAct, &QAction::triggered, this, &MainWindow::saveAs);
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
connect(exitAct, &QAction::triggered, this, &MainWindow::close);
brushColorAct = new QAction(tr("&Brush Color..."), this);
connect(brushColorAct, &QAction::triggered, this, &MainWindow::brushColor);
brushWidthAct = new QAction(tr("&Brush Width..."), this);
connect(brushWidthAct, &QAction::triggered, this, &MainWindow::brushWidth);
brushActionGroup = new QActionGroup(this);
aboutAct = new QAction(tr("&About"), this);
connect(aboutAct, &QAction::triggered, this, &MainWindow::about);
aboutQtAct = new QAction(tr("About &Qt"), this);
connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
aboutPluginsAct = new QAction(tr("About &Plugins"), this);
connect(aboutPluginsAct, &QAction::triggered, this, &MainWindow::aboutPlugins);
}
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openAct);
fileMenu->addAction(saveAsAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
brushMenu = menuBar()->addMenu(tr("&Brush"));
brushMenu->addAction(brushColorAct);
brushMenu->addAction(brushWidthAct);
brushMenu->addSeparator();
shapesMenu = menuBar()->addMenu(tr("&Shapes"));
filterMenu = menuBar()->addMenu(tr("&Filter"));
menuBar()->addSeparator();
helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(aboutAct);
helpMenu->addAction(aboutQtAct);
helpMenu->addAction(aboutPluginsAct);
}
//! [4]
void MainWindow::loadPlugins()
{
const auto staticInstances = QPluginLoader::staticInstances();
for (QObject *plugin : staticInstances)
populateMenus(plugin);
//! [4] //! [5]
pluginsDir = QDir(QCoreApplication::applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
pluginsDir.cd("plugins");
//! [5]
//! [6]
const auto entryList = pluginsDir.entryList(QDir::Files);
for (const QString &fileName : entryList) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin) {
populateMenus(plugin);
pluginFileNames += fileName;
//! [6] //! [7]
}
//! [7] //! [8]
}
//! [8]
//! [9]
brushMenu->setEnabled(!brushActionGroup->actions().isEmpty());
shapesMenu->setEnabled(!shapesMenu->actions().isEmpty());
filterMenu->setEnabled(!filterMenu->actions().isEmpty());
}
//! [9]
//! [10]
void MainWindow::populateMenus(QObject *plugin)
{
auto iBrush = qobject_cast<BrushInterface *>(plugin);
if (iBrush)
addToMenu(plugin, iBrush->brushes(), brushMenu, &MainWindow::changeBrush,
brushActionGroup);
auto iShape = qobject_cast<ShapeInterface *>(plugin);
if (iShape)
addToMenu(plugin, iShape->shapes(), shapesMenu, &MainWindow::insertShape);
auto iFilter = qobject_cast<FilterInterface *>(plugin);
if (iFilter)
addToMenu(plugin, iFilter->filters(), filterMenu, &MainWindow::applyFilter);
}
//! [10]
void MainWindow::addToMenu(QObject *plugin, const QStringList &texts,
QMenu *menu, Member member,
QActionGroup *actionGroup)
{
for (const QString &text : texts) {
auto action = new QAction(text, plugin);
connect(action, &QAction::triggered, this, member);
menu->addAction(action);
if (actionGroup) {
action->setCheckable(true);
actionGroup->addAction(action);
}
}
}

View File

@ -1,68 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDir>
#include <QMainWindow>
#include <QStringList>
QT_BEGIN_NAMESPACE
class QAction;
class QActionGroup;
class QMenu;
class QScrollArea;
QT_END_NAMESPACE
class PaintArea;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
private slots:
void open();
bool saveAs();
void brushColor();
void brushWidth();
void changeBrush();
void insertShape();
void applyFilter();
void about();
void aboutPlugins();
private:
typedef void (MainWindow::*Member)();
void createActions();
void createMenus();
void loadPlugins();
void populateMenus(QObject *plugin);
void addToMenu(QObject *plugin, const QStringList &texts, QMenu *menu,
Member member, QActionGroup *actionGroup = nullptr);
PaintArea *paintArea = nullptr;
QScrollArea *scrollArea = nullptr;
QDir pluginsDir;
QStringList pluginFileNames;
QMenu *fileMenu = nullptr;
QMenu *brushMenu = nullptr;
QMenu *shapesMenu = nullptr;
QMenu *filterMenu = nullptr;
QMenu *helpMenu = nullptr;
QActionGroup *brushActionGroup = nullptr;
QAction *openAct = nullptr;
QAction *saveAsAct = nullptr;
QAction *exitAct = nullptr;
QAction *brushWidthAct = nullptr;
QAction *brushColorAct = nullptr;
QAction *aboutAct = nullptr;
QAction *aboutQtAct = nullptr;
QAction *aboutPluginsAct = nullptr;
};
#endif

View File

@ -1,152 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "paintarea.h"
#include "interfaces.h"
#include <QMouseEvent>
#include <QPainter>
PaintArea::PaintArea(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_StaticContents);
setAttribute(Qt::WA_OpaquePaintEvent);
theImage.fill(qRgb(255, 255, 255));
}
bool PaintArea::openImage(const QString &fileName)
{
QImage image;
if (!image.load(fileName))
return false;
setImage(image);
return true;
}
bool PaintArea::saveImage(const QString &fileName, const char *fileFormat)
{
return theImage.save(fileName, fileFormat);
}
void PaintArea::setImage(const QImage &image)
{
theImage = image.convertToFormat(QImage::Format_RGB32);
update();
updateGeometry();
}
void PaintArea::insertShape(const QPainterPath &path)
{
pendingPath = path;
#ifndef QT_NO_CURSOR
setCursor(Qt::CrossCursor);
#endif
}
void PaintArea::setBrushColor(const QColor &color)
{
this->color = color;
}
void PaintArea::setBrushWidth(int width)
{
thickness = width;
}
//! [0]
void PaintArea::setBrush(BrushInterface *brushInterface, const QString &brush)
{
this->brushInterface = brushInterface;
this->brush = brush;
}
//! [0]
QSize PaintArea::sizeHint() const
{
return theImage.size();
}
void PaintArea::paintEvent(QPaintEvent * /* event */)
{
QPainter painter(this);
painter.drawImage(QPoint(0, 0), theImage);
}
void PaintArea::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
if (!pendingPath.isEmpty()) {
QPainter painter(&theImage);
setupPainter(painter);
const QRectF boundingRect = pendingPath.boundingRect();
QLinearGradient gradient(boundingRect.topRight(),
boundingRect.bottomLeft());
gradient.setColorAt(0.0, QColor(color.red(), color.green(),
color.blue(), 63));
gradient.setColorAt(1.0, QColor(color.red(), color.green(),
color.blue(), 191));
painter.setBrush(gradient);
painter.translate(event->position().toPoint() - boundingRect.center());
painter.drawPath(pendingPath);
pendingPath = QPainterPath();
#ifndef QT_NO_CURSOR
unsetCursor();
#endif
update();
} else {
if (brushInterface) {
QPainter painter(&theImage);
setupPainter(painter);
const QRect rect = brushInterface->mousePress(brush, painter,
event->position().toPoint());
update(rect);
}
lastPos = event->position().toPoint();
}
}
}
//! [1]
void PaintArea::mouseMoveEvent(QMouseEvent *event)
{
if ((event->buttons() & Qt::LeftButton) && lastPos != QPoint(-1, -1)) {
if (brushInterface) {
QPainter painter(&theImage);
setupPainter(painter);
const QRect rect = brushInterface->mouseMove(brush, painter, lastPos,
event->position().toPoint());
update(rect);
}
lastPos = event->position().toPoint();
}
}
//! [1]
void PaintArea::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && lastPos != QPoint(-1, -1)) {
if (brushInterface) {
QPainter painter(&theImage);
setupPainter(painter);
QRect rect = brushInterface->mouseRelease(brush, painter,
event->position().toPoint());
update(rect);
}
lastPos = QPoint(-1, -1);
}
}
void PaintArea::setupPainter(QPainter &painter)
{
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(color, thickness, Qt::SolidLine, Qt::RoundCap,
Qt::RoundJoin));
}

View File

@ -1,54 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef PAINTAREA_H
#define PAINTAREA_H
#include <QColor>
#include <QImage>
#include <QPainterPath>
#include <QWidget>
class BrushInterface;
class PaintArea : public QWidget
{
Q_OBJECT
public:
PaintArea(QWidget *parent = nullptr);
bool openImage(const QString &fileName);
bool saveImage(const QString &fileName, const char *fileFormat);
void setImage(const QImage &image);
void insertShape(const QPainterPath &path);
void setBrushColor(const QColor &color);
void setBrushWidth(int width);
void setBrush(BrushInterface *brushInterface, const QString &brush);
QImage image() const { return theImage; }
QColor brushColor() const { return color; }
int brushWidth() const { return thickness; }
QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
void setupPainter(QPainter &painter);
QImage theImage = {500, 400, QImage::Format_RGB32};
QColor color = Qt::blue;
int thickness = 3;
BrushInterface *brushInterface = nullptr;
QString brush;
QPoint lastPos = {-1, -1};
QPainterPath pendingPath;
};
#endif

View File

@ -1,118 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "plugindialog.h"
#include "interfaces.h"
#include <QDir>
#include <QGridLayout>
#include <QHeaderView>
#include <QLabel>
#include <QPluginLoader>
#include <QPushButton>
#include <QStringList>
#include <QTreeWidget>
#include <QTreeWidgetItem>
PluginDialog::PluginDialog(const QString &path, const QStringList &fileNames,
QWidget *parent) :
QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK")))
{
treeWidget->setAlternatingRowColors(false);
treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
treeWidget->setColumnCount(1);
treeWidget->header()->hide();
okButton->setDefault(true);
connect(okButton, &QAbstractButton::clicked, this, &QWidget::close);
QGridLayout *mainLayout = new QGridLayout;
mainLayout->setColumnStretch(0, 1);
mainLayout->setColumnStretch(2, 1);
mainLayout->addWidget(label, 0, 0, 1, 3);
mainLayout->addWidget(treeWidget, 1, 0, 1, 3);
mainLayout->addWidget(okButton, 2, 1);
setLayout(mainLayout);
interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirOpenIcon),
QIcon::Normal, QIcon::On);
interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon),
QIcon::Normal, QIcon::Off);
featureIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon));
setWindowTitle(tr("Plugin Information"));
findPlugins(path, fileNames);
}
//! [0]
void PluginDialog::findPlugins(const QString &path,
const QStringList &fileNames)
{
label->setText(tr("Plug & Paint found the following plugins\n"
"(looked in %1):")
.arg(QDir::toNativeSeparators(path)));
const QDir dir(path);
const auto staticInstances = QPluginLoader::staticInstances();
for (QObject *plugin : staticInstances)
populateTreeWidget(plugin, tr("%1 (Static Plugin)")
.arg(plugin->metaObject()->className()));
for (const QString &fileName : fileNames) {
QPluginLoader loader(dir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin)
populateTreeWidget(plugin, fileName);
}
}
//! [0]
//! [1]
void PluginDialog::populateTreeWidget(QObject *plugin, const QString &text)
{
auto pluginItem = new QTreeWidgetItem(treeWidget);
pluginItem->setText(0, text);
pluginItem->setExpanded(true);
QFont boldFont = pluginItem->font(0);
boldFont.setBold(true);
pluginItem->setFont(0, boldFont);
if (plugin) {
auto iBrush = qobject_cast<BrushInterface *>(plugin);
if (iBrush)
addItems(pluginItem, "BrushInterface", iBrush->brushes());
auto iShape = qobject_cast<ShapeInterface *>(plugin);
if (iShape)
addItems(pluginItem, "ShapeInterface", iShape->shapes());
auto iFilter = qobject_cast<FilterInterface *>(plugin);
if (iFilter)
addItems(pluginItem, "FilterInterface", iFilter->filters());
}
}
//! [1]
void PluginDialog::addItems(QTreeWidgetItem *pluginItem,
const char *interfaceName,
const QStringList &features)
{
auto interfaceItem = new QTreeWidgetItem(pluginItem);
interfaceItem->setText(0, interfaceName);
interfaceItem->setIcon(0, interfaceIcon);
for (QString feature : features) {
if (feature.endsWith("..."))
feature.chop(3);
auto featureItem = new QTreeWidgetItem(interfaceItem);
featureItem->setText(0, feature);
featureItem->setIcon(0, featureIcon);
}
}

View File

@ -1,38 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef PLUGINDIALOG_H
#define PLUGINDIALOG_H
#include <QDialog>
#include <QIcon>
QT_BEGIN_NAMESPACE
class QLabel;
class QPushButton;
class QTreeWidget;
class QTreeWidgetItem;
QT_END_NAMESPACE
class PluginDialog : public QDialog
{
Q_OBJECT
public:
PluginDialog(const QString &path, const QStringList &fileNames,
QWidget *parent = nullptr);
private:
void findPlugins(const QString &path, const QStringList &fileNames);
void populateTreeWidget(QObject *plugin, const QString &text);
void addItems(QTreeWidgetItem *pluginItem, const char *interfaceName,
const QStringList &features);
QLabel *label = nullptr;
QTreeWidget *treeWidget = nullptr;
QPushButton *okButton = nullptr;
QIcon interfaceIcon;
QIcon featureIcon;
};
#endif

View File

@ -1,7 +0,0 @@
QT_FOR_CONFIG += widgets
requires(qtConfig(inputdialog))
TEMPLATE = subdirs
SUBDIRS = plugins app
app.depends = plugins

View File

@ -1,2 +0,0 @@
add_subdirectory(basictools)
add_subdirectory(extrafilters)

View File

@ -1,18 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_add_plugin(pnp_basictools
STATIC
CLASS_NAME BasicToolsPlugin
basictoolsplugin.cpp basictoolsplugin.h
)
target_include_directories(pnp_basictools PRIVATE
../../app
)
target_link_libraries(pnp_basictools PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)

View File

@ -1,17 +0,0 @@
#! [0]
TEMPLATE = lib
CONFIG += plugin static
QT += widgets
INCLUDEPATH += ../../app
HEADERS = basictoolsplugin.h
SOURCES = basictoolsplugin.cpp
TARGET = $$qtLibraryTarget(pnp_basictools)
DESTDIR = ../../plugins
#! [0]
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/plugandpaint/plugins
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!
uikit: CONFIG += debug_and_release

View File

@ -1,150 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "basictoolsplugin.h"
#include <QInputDialog>
#include <QPainter>
#include <QRandomGenerator>
#include <QtMath>
//! [0]
QStringList BasicToolsPlugin::brushes() const
{
return {tr("Pencil"), tr("Air Brush"), tr("Random Letters")};
}
//! [0]
//! [1]
QRect BasicToolsPlugin::mousePress(const QString &brush, QPainter &painter,
const QPoint &pos)
{
return mouseMove(brush, painter, pos, pos);
}
//! [1]
//! [2]
QRect BasicToolsPlugin::mouseMove(const QString &brush, QPainter &painter,
const QPoint &oldPos, const QPoint &newPos)
{
painter.save();
int rad = painter.pen().width() / 2;
QRect boundingRect = QRect(oldPos, newPos).normalized()
.adjusted(-rad, -rad, +rad, +rad);
QColor color = painter.pen().color();
int thickness = painter.pen().width();
QColor transparentColor(color.red(), color.green(), color.blue(), 0);
//! [2] //! [3]
if (brush == tr("Pencil")) {
painter.drawLine(oldPos, newPos);
} else if (brush == tr("Air Brush")) {
int numSteps = 2 + (newPos - oldPos).manhattanLength() / 2;
painter.setBrush(QBrush(color, Qt::Dense6Pattern));
painter.setPen(Qt::NoPen);
for (int i = 0; i < numSteps; ++i) {
int x = oldPos.x() + i * (newPos.x() - oldPos.x()) / (numSteps - 1);
int y = oldPos.y() + i * (newPos.y() - oldPos.y()) / (numSteps - 1);
painter.drawEllipse(x - (thickness / 2), y - (thickness / 2),
thickness, thickness);
}
} else if (brush == tr("Random Letters")) {
QChar ch(QRandomGenerator::global()->bounded('A', 'Z' + 1));
QFont biggerFont = painter.font();
biggerFont.setBold(true);
biggerFont.setPointSize(biggerFont.pointSize() + thickness);
painter.setFont(biggerFont);
painter.drawText(newPos, QString(ch));
QFontMetrics metrics(painter.font());
boundingRect = metrics.boundingRect(ch);
boundingRect.translate(newPos);
boundingRect.adjust(-10, -10, +10, +10);
}
painter.restore();
return boundingRect;
}
//! [3]
//! [4]
QRect BasicToolsPlugin::mouseRelease(const QString & /* brush */,
QPainter & /* painter */,
const QPoint & /* pos */)
{
return QRect(0, 0, 0, 0);
}
//! [4]
//! [5]
QStringList BasicToolsPlugin::shapes() const
{
return {tr("Circle"), tr("Star"), tr("Text...")};
}
//! [5]
//! [6]
QPainterPath BasicToolsPlugin::generateShape(const QString &shape,
QWidget *parent)
{
QPainterPath path;
if (shape == tr("Circle")) {
path.addEllipse(0, 0, 50, 50);
} else if (shape == tr("Star")) {
path.moveTo(90, 50);
for (int i = 1; i < 5; ++i) {
path.lineTo(50 + 40 * std::cos(0.8 * i * M_PI),
50 + 40 * std::sin(0.8 * i * M_PI));
}
path.closeSubpath();
} else if (shape == tr("Text...")) {
QString text = QInputDialog::getText(parent, tr("Text Shape"),
tr("Enter text:"),
QLineEdit::Normal, tr("Qt"));
if (!text.isEmpty()) {
QFont timesFont("Times", 50);
timesFont.setStyleStrategy(QFont::ForceOutline);
path.addText(0, 0, timesFont, text);
}
}
return path;
}
//! [6]
//! [7]
QStringList BasicToolsPlugin::filters() const
{
return {tr("Invert Pixels"), tr("Swap RGB"), tr("Grayscale")};
}
//! [7]
//! [8]
QImage BasicToolsPlugin::filterImage(const QString &filter, const QImage &image,
QWidget * /* parent */)
{
QImage result = image.convertToFormat(QImage::Format_RGB32);
if (filter == tr("Invert Pixels")) {
result.invertPixels();
} else if (filter == tr("Swap RGB")) {
result = result.rgbSwapped();
} else if (filter == tr("Grayscale")) {
for (int y = 0; y < result.height(); ++y) {
for (int x = 0; x < result.width(); ++x) {
QRgb pixel = result.pixel(x, y);
int gray = qGray(pixel);
int alpha = qAlpha(pixel);
result.setPixel(x, y, qRgba(gray, gray, gray, alpha));
}
}
}
return result;
}
//! [8]

View File

@ -1,54 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef BASICTOOLSPLUGIN_H
#define BASICTOOLSPLUGIN_H
//! [0]
#include <interfaces.h>
#include <QImage>
#include <QObject>
#include <QPainterPath>
#include <QRect>
#include <QStringList>
#include <QtPlugin>
//! [1]
class BasicToolsPlugin : public QObject,
public BrushInterface,
public ShapeInterface,
public FilterInterface
{
Q_OBJECT
//! [4]
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface" FILE "basictools.json")
//! [4]
Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)
//! [0]
//! [2]
public:
//! [1]
// BrushInterface
QStringList brushes() const override;
QRect mousePress(const QString &brush, QPainter &painter,
const QPoint &pos) override;
QRect mouseMove(const QString &brush, QPainter &painter,
const QPoint &oldPos, const QPoint &newPos) override;
QRect mouseRelease(const QString &brush, QPainter &painter,
const QPoint &pos) override;
// ShapeInterface
QStringList shapes() const override;
QPainterPath generateShape(const QString &shape, QWidget *parent) override;
// FilterInterface
QStringList filters() const override;
QImage filterImage(const QString &filter, const QImage &image,
QWidget *parent) override;
//! [3]
};
//! [2] //! [3]
#endif

View File

@ -1,26 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_add_plugin(pnp_extrafilters
CLASS_NAME ExtraFiltersPlugin
extrafiltersplugin.cpp extrafiltersplugin.h
)
set_target_properties(pnp_extrafilters PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/app"
)
target_include_directories(pnp_extrafilters PRIVATE
../../app
)
target_link_libraries(pnp_extrafilters PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
install(TARGETS pnp_extrafilters
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}/plugins"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}/plugins"
)

View File

@ -1,17 +0,0 @@
#! [0]
TEMPLATE = lib
CONFIG += plugin
QT += widgets
INCLUDEPATH += ../../app
HEADERS = extrafiltersplugin.h
SOURCES = extrafiltersplugin.cpp
TARGET = $$qtLibraryTarget(pnp_extrafilters)
DESTDIR = ../../plugins
#! [0]
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/plugandpaint/plugins
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!
uikit: CONFIG += debug_and_release

View File

@ -1,82 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "extrafiltersplugin.h"
#include <QInputDialog>
QStringList ExtraFiltersPlugin::filters() const
{
return {tr("Flip Horizontally"), tr("Flip Vertically"),
tr("Smudge..."), tr("Threshold...")};
}
QImage ExtraFiltersPlugin::filterImage(const QString &filter,
const QImage &image, QWidget *parent)
{
QImage original = image.convertToFormat(QImage::Format_RGB32);
QImage result = original;
if (filter == tr("Flip Horizontally")) {
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(original.width() - x - 1, y);
result.setPixel(x, y, pixel);
}
}
} else if (filter == tr("Flip Vertically")) {
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(x, original.height() - y - 1);
result.setPixel(x, y, pixel);
}
}
} else if (filter == tr("Smudge...")) {
bool ok;
int numIters = QInputDialog::getInt(parent, tr("Smudge Filter"),
tr("Enter number of iterations:"),
5, 1, 20, 1, &ok);
if (ok) {
for (int i = 0; i < numIters; ++i) {
for (int y = 1; y < original.height() - 1; ++y) {
for (int x = 1; x < original.width() - 1; ++x) {
QRgb p1 = original.pixel(x, y);
QRgb p2 = original.pixel(x, y + 1);
QRgb p3 = original.pixel(x, y - 1);
QRgb p4 = original.pixel(x + 1, y);
QRgb p5 = original.pixel(x - 1, y);
int red = (qRed(p1) + qRed(p2) + qRed(p3) + qRed(p4)
+ qRed(p5)) / 5;
int green = (qGreen(p1) + qGreen(p2) + qGreen(p3)
+ qGreen(p4) + qGreen(p5)) / 5;
int blue = (qBlue(p1) + qBlue(p2) + qBlue(p3)
+ qBlue(p4) + qBlue(p5)) / 5;
int alpha = (qAlpha(p1) + qAlpha(p2) + qAlpha(p3)
+ qAlpha(p4) + qAlpha(p5)) / 5;
result.setPixel(x, y, qRgba(red, green, blue, alpha));
}
}
}
}
} else if (filter == tr("Threshold...")) {
bool ok;
int threshold = QInputDialog::getInt(parent, tr("Threshold Filter"),
tr("Enter threshold:"),
10, 1, 256, 1, &ok);
if (ok) {
int factor = 256 / threshold;
for (int y = 0; y < original.height(); ++y) {
for (int x = 0; x < original.width(); ++x) {
QRgb pixel = original.pixel(x, y);
result.setPixel(x, y, qRgba(qRed(pixel) / factor * factor,
qGreen(pixel) / factor * factor,
qBlue(pixel) / factor * factor,
qAlpha(pixel)));
}
}
}
}
return result;
}

View File

@ -1,28 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef EXTRAFILTERSPLUGIN_H
#define EXTRAFILTERSPLUGIN_H
//! [0]
#include <interfaces.h>
#include <QObject>
#include <QtPlugin>
#include <QStringList>
#include <QImage>
class ExtraFiltersPlugin : public QObject, public FilterInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.FilterInterface" FILE "extrafilters.json")
Q_INTERFACES(FilterInterface)
public:
QStringList filters() const override;
QImage filterImage(const QString &filter, const QImage &image,
QWidget *parent) override;
};
//! [0]
#endif

View File

@ -1,3 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = basictools \
extrafilters

View File

@ -151,7 +151,7 @@ void MainWindow::createActions()
QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(tr("&About"), this, &MainWindow::about);
helpMenu->addAction(tr("About &Qt"), qApp, &QCoreApplication::quit);
helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
}
void MainWindow::setSettingsObject(const SettingsPtr &settings)

View File

@ -3,7 +3,6 @@ SUBDIRS = \
completer \
customcompleter \
echoplugin \
plugandpaint \
regularexpression \
settingseditor \
styleplugin \
@ -12,6 +11,5 @@ SUBDIRS = \
!qtConfig(library) {
SUBDIRS -= \
echoplugin \
plugandpaint
echoplugin
}

View File

@ -7,8 +7,6 @@
//! [0]
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(treemodelcompleter);
QApplication app(argc, argv);
MainWindow window;
window.show();

View File

@ -8,8 +8,6 @@
//! [0]
int main(int argv, char *args[])
{
Q_INIT_RESOURCE(undoframework);
QApplication app(argv, args);
MainWindow mainWindow;