void MainWindow::openImage()
{
qDebug() << “slot openImage is called.”;
QFileDialog dialog(this);
dialog.setWindowTitle(“Open Image”);
dialog.setFileMode(QFileDialog::ExistingFile);
dialog.setNameFilter(tr(“Images (*.png *.bmp *.jpg)”));
QStringList filePaths;
if (dialog.exec()) {
filePaths = dialog.selectedFiles();
showImage(filePaths.at(0));
}
}
void MainWindow::showImage(QString path)
{
imageScene->clear();
imageView->resetTransform();
QPixmap image(path);
currentImage = imageScene->addPixmap(image);
imageScene->update();
imageView->setSceneRect(image.rect());
currentImagePath = path;
}
编译运行
主窗口程序编写完成后,编译测试
$ qmake -makefile
$ make
$ ./ImageView
由于上述代码并非本文主要说明对象,因此不做过多解释。
接下来,使用Qt插件机制,实现图片模糊操作。
首先是一些必须安装的依赖项:
Qt插件机制是一种强大的方法,它使Qt应用程序更具可扩展性。使用此机制抽象出一种可以轻松添加新功能的方法。
完成后,只需要注意功能的名称和操作,就可以添加一个新功能。
第一步是找出一个接口,以便在应用程序和插件之间提供一个公共协议,这样就可以加载和调用插件,而不管它们是如何实现的。在C++中,接口是一个带有纯虚成员函数的类。对于插件,处理动作名和操作,因此,创建editor_plugin_interface.h文件,在editor_plugin_interface.h中声明接口:
#ifndef EDITOR_PLUGIN_INTERFACE_H
#define EDITOR_PLUGIN_INTERFACE_H
#include
#include
//引入opencv库方便编辑操作
#include “opencv2/opencv.hpp”
class EditorPluginInterface
{
public:
virtual ~EditorPluginInterface(){};
virtual QString name()=0;
virtual void edit(const cv::Mat &input,cv::Mat &output)=0;
};
#define EDIT_PLUGIN_INTERFACE_IID “com.kdr2.editorplugininterface”
Q_DECLARE_INTERFACE(EditorPluginInterface,EDIT_PLUGIN_INTERFACE_IID);
#endif // EDITOR_PLUGIN_INTERFACE_H
声明一个名为EditorPluginInterface的类,它是接口类。在这个类中,除了一个虚的空析构函数,可以看到两个纯虚成员函数:name和edit函数。name函数返回一个QString,它将是编辑操作的名称。edit函数以Mat的两个引用作为其输入和输出函数,用于编辑操作。每个插件都是这个接口的一个子类,这两个函数的实现将决定操作名和编辑操作。
在类声明之后,定义一个唯一的标识字符串com.kdr2.editorplugininterface作为接口的ID。这个ID在应用程序范围内必须是唯一的,也就是说,如果编写其他接口,则必须为它们使用不同的ID。然后,使用Q_DECLARE_INTERFACE宏将接口的类名与定义的唯一标识符相关联,这样Qt的插件系统就可以在加载插件之前识别该接口的插件。至此,编辑功能的界面已经确定。编写一个插件来实现这个接口。
编写Qt插件,应该从头开始一个新的Qt项目。考虑到主要目的是引入Qt库的插件机制,将使用OpenCV库中的一个简单函数进行简单的编辑以保持代码清晰。这里,调用OpenCV库中的模糊函数来模糊图像。
将插件命名BlurPlugin,然后从头开始创建项目,插件目录和主程序目录在同一级:
$ cd …
$ ls
ImageView
$ mkdir BlurPlugin
$ ls
ImageView BlurPlugin
$ cd blurPlugin
$ touch blur_plugin.h blur_plugin.cpp
$ qmake -project
首先,将目录更改为ImageView项目的父目录
,创建一个名为blurPlugin
的新目录,然后进入该目录。创建两个空的源文件,blur_plugin.h
和blur_plugin.cpp
。运行qmake -project
,它将创建名为BlurPlugin.pro
项目文件,修改项目文件设置:
TEMPLATE = lib
TARGET = ErodePlugin
CONFIG += plugin
INCLUDEPATH += . …/ImageEditor
在项目文件中使用lib而不是app作为其模板设置的值。添加了一行CONFIG+=plugin,告诉qmake这个项目是一个Qt插件项目。最后,将ImageView项目的根目录添加为该项目的include路径中的一项,这样编译器就可以找到接口头文件editor_plugin_interface.h。
在这个插件中,还需要OpenCV来实现编辑功能,因此需要在Qt插件项目的设置中添加OpenCV库的信息,库路径和包含库的路径(根据自己的OpenCV安装目录):
unix:!mac {
INCLUDEPATH += /home/brainiac/Program/opencv4/include/opencv4
LIBS += -L/home/brainiac/Program/opencv4/lib -lopencv_core -l opencv_imgproc
}
unix:mac {
INCLUDEPATH += /path/to/opencv/include/opencv4
LIBS += -L/path/to/opencv4/lib -lopencv_world
}
WIN32 {
INCLUDEPATH += C:/path/to/opencv/include/opencv4
LIBS += -lc:/path/to/opencv4/lib/opencv_world
}
在项目文件的结尾,将头文件和C++源文件添加到项目中:
HEADERS += blur_plugin.h
SOURCES += blur_plugin.cpp
插件的项目文件已经完成,开始编写插件。为一个新的功能编写一个插件只是为了提供EditorPluginInterface接口的实现。因此,在blur_plugin.h中声明该接口的一个子类:
#include
#include
#include “editor_plugin_interface.h”
class BlurPlugin:public QObject,public EditorPluginInterface
{
Q_OBJECT;
Q_PLUGIN_METADATA(IID EDIT_PLUGIN_INTERFACE_IID);
Q_INTERFACES(EditorPluginInterface);
public:
QString name();
void edit(const cv::Mat &input,cv::Mat &output);
};
在包含必要的头文件之后,声明了一个名为BlurPlugin的类,它继承了QObject和EditorPluginInterface。后者是在editor_plugin_interface.h中定义的接口。将插件实现作为QOBject的子类,是因为Qt元对象系统和插件机制的要求。在类的主体中,使用Qt库定义的一些宏添加更多信息:
Q_OBJECT;
Q_PLUGIN_METADATA(IID EDIT_PLUGIN_INTERFACE_IID);
Q_INTERFACES(EditorPluginInterface);
Q_OBJECT宏与Qt
元对象系统有关。
Q_PLUGIN_METADATA(IID EDIT_PLUGIN_INTERFACE_IID);
声明此插件的元数据,在这里声明为在editor_plugin_interface.h中定义的插件接口的唯一标识符作为其IID元数据。
使用Q_INTERFACES(EditorPluginInterface);
告诉Qt这个类正试图实现的是EditorPluginInterface接口。由于前面的信息的清楚声明,Qt插件系统对这个项目了如指掌:
这是一个Qt插件项目,所以项目的目标是生成库文件。
这个插件是EditorPluginInterface的一个实例,它的IID是EDIT_PLUGIN_INTERFACE_IID,因此Qt应用程序可以加载这个插件。
在接口中声明两个重要成员函数:
public:
QString name();
void edit(const cv::Mat &input,cv::Mat &output);
然后,在blur_plugin.cpp文件中实现这两个函数。对于name函数,只返回一个QString Blur,作为插件的名称(也是操作的名称):
#include “blur_plugin.h”
QString BlurPlugin::name()
{
return “Blur”;
}
对于操作函数:
void BlurPlugin::edit(const cv::Mat &input, cv::Mat &output)
{
blur(input,output,cv::Mat());
}
只需调用由OpenCV库提供的模糊函数。
编译插件项目。与编译普通Qt应用程序的方法相同。
$ qmake -makefile
$ make
$ ls -l .so
-rwxr-xr-x 1 brainiac brainiac 74480 Jul 21 10:10 libBlurPlugin.so
编译过程完成后,使用ls -l _.so_检查输出文件,输出共享对象文件。这些是将加载到应用程序中的插件文件。
在检查输出文件时,可能会发现有许多扩展名类似1.0.0的文件。这些类型的字符串是库文件的版本号。这些文件大多是一个真正的库文件的别名。
如果使用平台并非Linux,那么输出文件可能也会有所不同:在Windows上,这些文件的名称类似于BlurPlugin.dll,而在macOS上,这些文件被命名为libBlurPlugin.dylib.
将Blur插件加载到应用程序中,就可以使用模糊操作。之后,将看到一个名为模糊的新操作,可以在编辑菜单和编辑工具栏上找到。
加载插件首先,修改ImageView项目的项目文件ImageView.pro
,并将包含插件接口的头文件添加到HEADERS列表中,同时声明OpenCV库位置:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-LgU4ixXd-1712513057972)]