mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-06 01:05:23 +08:00
qt 6.5.1 original
This commit is contained in:
36
examples/widgets/tools/plugandpaint/app/CMakeLists.txt
Normal file
36
examples/widgets/tools/plugandpaint/app/CMakeLists.txt
Normal file
@ -0,0 +1,36 @@
|
||||
# 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}"
|
||||
)
|
37
examples/widgets/tools/plugandpaint/app/app.pro
Normal file
37
examples/widgets/tools/plugandpaint/app/app.pro
Normal file
@ -0,0 +1,37 @@
|
||||
#! [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!
|
76
examples/widgets/tools/plugandpaint/app/interfaces.h
Normal file
76
examples/widgets/tools/plugandpaint/app/interfaces.h
Normal file
@ -0,0 +1,76 @@
|
||||
// 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
|
19
examples/widgets/tools/plugandpaint/app/main.cpp
Normal file
19
examples/widgets/tools/plugandpaint/app/main.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
// 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]
|
282
examples/widgets/tools/plugandpaint/app/mainwindow.cpp
Normal file
282
examples/widgets/tools/plugandpaint/app/mainwindow.cpp
Normal file
@ -0,0 +1,282 @@
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
68
examples/widgets/tools/plugandpaint/app/mainwindow.h
Normal file
68
examples/widgets/tools/plugandpaint/app/mainwindow.h
Normal file
@ -0,0 +1,68 @@
|
||||
// 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
|
152
examples/widgets/tools/plugandpaint/app/paintarea.cpp
Normal file
152
examples/widgets/tools/plugandpaint/app/paintarea.cpp
Normal file
@ -0,0 +1,152 @@
|
||||
// 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));
|
||||
}
|
54
examples/widgets/tools/plugandpaint/app/paintarea.h
Normal file
54
examples/widgets/tools/plugandpaint/app/paintarea.h
Normal file
@ -0,0 +1,54 @@
|
||||
// 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
|
118
examples/widgets/tools/plugandpaint/app/plugindialog.cpp
Normal file
118
examples/widgets/tools/plugandpaint/app/plugindialog.cpp
Normal file
@ -0,0 +1,118 @@
|
||||
// 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);
|
||||
}
|
||||
}
|
38
examples/widgets/tools/plugandpaint/app/plugindialog.h
Normal file
38
examples/widgets/tools/plugandpaint/app/plugindialog.h
Normal file
@ -0,0 +1,38 @@
|
||||
// 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
|
Reference in New Issue
Block a user