mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-02 23:35:28 +08:00
6.5.3 clean
This commit is contained in:
@ -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()
|
||||
|
@ -7,8 +7,6 @@
|
||||
//! [0]
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
Q_INIT_RESOURCE(completer);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
MainWindow window;
|
||||
window.show();
|
||||
|
@ -7,8 +7,6 @@
|
||||
//! [0]
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
Q_INIT_RESOURCE(customcompleter);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
MainWindow window;
|
||||
window.show();
|
||||
|
@ -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")
|
||||
|
@ -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)
|
@ -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}"
|
||||
)
|
@ -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!
|
@ -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
|
@ -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]
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
@ -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));
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
@ -1,7 +0,0 @@
|
||||
QT_FOR_CONFIG += widgets
|
||||
requires(qtConfig(inputdialog))
|
||||
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = plugins app
|
||||
|
||||
app.depends = plugins
|
@ -1,2 +0,0 @@
|
||||
add_subdirectory(basictools)
|
||||
add_subdirectory(extrafilters)
|
@ -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
|
||||
)
|
@ -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
|
@ -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]
|
@ -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
|
@ -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"
|
||||
)
|
@ -1 +0,0 @@
|
||||
{}
|
@ -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
|
@ -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;
|
||||
}
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = basictools \
|
||||
extrafilters
|
@ -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)
|
||||
|
@ -3,7 +3,6 @@ SUBDIRS = \
|
||||
completer \
|
||||
customcompleter \
|
||||
echoplugin \
|
||||
plugandpaint \
|
||||
regularexpression \
|
||||
settingseditor \
|
||||
styleplugin \
|
||||
@ -12,6 +11,5 @@ SUBDIRS = \
|
||||
|
||||
!qtConfig(library) {
|
||||
SUBDIRS -= \
|
||||
echoplugin \
|
||||
plugandpaint
|
||||
echoplugin
|
||||
}
|
||||
|
@ -7,8 +7,6 @@
|
||||
//! [0]
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
Q_INIT_RESOURCE(treemodelcompleter);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
MainWindow window;
|
||||
window.show();
|
||||
|
@ -8,8 +8,6 @@
|
||||
//! [0]
|
||||
int main(int argv, char *args[])
|
||||
{
|
||||
Q_INIT_RESOURCE(undoframework);
|
||||
|
||||
QApplication app(argv, args);
|
||||
|
||||
MainWindow mainWindow;
|
||||
|
Reference in New Issue
Block a user