├── Plugins ├── StylePlugin │ ├── plugin │ │ ├── simple_style.json │ │ ├── simple_style.h │ │ ├── plugin.pro │ │ └── style_plugin.h │ ├── style_plugin.pro │ └── app │ │ ├── app.pro │ │ └── main.cpp └── PersonPlugin │ ├── person_plugin.pro │ ├── plugin │ ├── programmer.json │ ├── programmer.cpp │ ├── plugin.pro │ ├── person.h │ └── programmer.h │ └── app │ ├── app.pro │ └── main.cpp ├── README.md ├── .gitignore └── LICENSE /Plugins/StylePlugin/plugin/simple_style.json: -------------------------------------------------------------------------------- 1 | { 2 | "Keys": [ "simplestyle" ] 3 | } 4 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/style_plugin.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = subdirs 2 | CONFIG += ordered 3 | SUBDIRS = \ 4 | plugin \ 5 | app 6 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/person_plugin.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = subdirs 2 | CONFIG += ordered 3 | SUBDIRS = \ 4 | plugin \ 5 | app 6 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/plugin/programmer.json: -------------------------------------------------------------------------------- 1 | { 2 | "author" : "Waleon", 3 | "date" : "2017/09/01", 4 | "name" : "personPlugin", 5 | "version" : "1.0.0", 6 | "dependencies" : [] 7 | } 8 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/app/app.pro: -------------------------------------------------------------------------------- 1 | QT += widgets 2 | SOURCES += main.cpp 3 | TARGET = app 4 | 5 | win32 { 6 | debug:DESTDIR = ../debug/ 7 | release:DESTDIR = ../release/ 8 | } else { 9 | DESTDIR = ../ 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Qt 2 | 3 | Qt 示例程序 4 | 5 | 6 | # 更多精彩 7 | 8 | - 个人博客:[一去、二三里](https://waleon.blog.csdn.net/ "一去、二三里") 9 | - 微信号:iwaleon 10 | - 微信公众号:高效程序员 11 | 12 | ![微信公众号](https://raw.githubusercontent.com/Waleon/DesignPatterns/master/assets/qrcode.jpg) 13 | 14 | 更多干货,请扫码关注微信公众号,不要太惊喜哦~ 15 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/app/app.pro: -------------------------------------------------------------------------------- 1 | QT += core 2 | QT -= gui 3 | 4 | CONFIG += c++11 5 | 6 | TARGET = app 7 | CONFIG += console 8 | TEMPLATE = app 9 | 10 | INCLUDEPATH += $$PWD/.. 11 | 12 | SOURCES += main.cpp 13 | 14 | win32 { 15 | debug:DESTDIR = ../debug/ 16 | release:DESTDIR = ../release/ 17 | } else { 18 | DESTDIR = ../ 19 | } 20 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/plugin/programmer.cpp: -------------------------------------------------------------------------------- 1 | #include "programmer.h" 2 | #include 3 | 4 | QString Programmer::name() 5 | { 6 | return "Pony"; 7 | } 8 | 9 | void Programmer::eat() 10 | { 11 | qDebug() << "Pizza"; 12 | } 13 | 14 | void Programmer::sleep() 15 | { 16 | qDebug() << "6 hours"; 17 | } 18 | 19 | void Programmer::doSomething() 20 | { 21 | qDebug() << "Coding..."; 22 | } 23 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/plugin/simple_style.h: -------------------------------------------------------------------------------- 1 | #ifndef SIMPLE_STYLE_H 2 | #define SIMPLE_STYLE_H 3 | 4 | #include 5 | 6 | class SimpleStyle : public QProxyStyle 7 | { 8 | Q_OBJECT 9 | 10 | public: 11 | SimpleStyle() {} 12 | 13 | void polish(QPalette &palette) override 14 | { 15 | palette.setBrush(QPalette::ButtonText, Qt::blue); 16 | } 17 | }; 18 | 19 | #endif // SIMPLE_STYLE_H 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/plugin/plugin.pro: -------------------------------------------------------------------------------- 1 | QT += widgets 2 | TEMPLATE = lib 3 | CONFIG += plugin 4 | TARGET = stylePlugin 5 | 6 | HEADERS += \ 7 | simple_style.h \ 8 | style_plugin.h 9 | 10 | OTHER_FILES += simple_style.json 11 | 12 | win32 { 13 | CONFIG(debug, release|debug):DESTDIR = ../debug/styles/ 14 | CONFIG(release, release|debug):DESTDIR = ../release/styles/ 15 | } else { 16 | DESTDIR = ../styles/ 17 | } 18 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/plugin/plugin.pro: -------------------------------------------------------------------------------- 1 | QT += core 2 | QT -= gui 3 | 4 | TEMPLATE = lib 5 | CONFIG += plugin 6 | TARGET = personPlugin 7 | 8 | HEADERS += \ 9 | person.h \ 10 | programmer.h 11 | 12 | SOURCES += programmer.cpp 13 | 14 | OTHER_FILES += programmer.json 15 | 16 | win32 { 17 | CONFIG(debug, release|debug):DESTDIR = ../debug/plugins/ 18 | CONFIG(release, release|debug):DESTDIR = ../release/plugins/ 19 | } else { 20 | DESTDIR = ../plugins/ 21 | } 22 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/app/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argv, char *args[]) 7 | { 8 | QApplication app(argv, args); 9 | 10 | // 设置样式 11 | qDebug() << QStyleFactory::keys(); 12 | QApplication::setStyle(QStyleFactory::create("simplestyle")); 13 | 14 | QPushButton button("Blue Button"); 15 | button.resize(300, 100); 16 | button.show(); 17 | 18 | return app.exec(); 19 | } 20 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/plugin/person.h: -------------------------------------------------------------------------------- 1 | #ifndef PERSON_H 2 | #define PERSON_H 3 | 4 | #include 5 | #include 6 | 7 | class IPerson 8 | { 9 | public: 10 | virtual ~IPerson() {} 11 | virtual QString name() = 0; // 人有名字 12 | virtual void eat() = 0; // 人需要吃东西 13 | virtual void sleep() = 0; // 人需要睡觉 14 | virtual void doSomething() = 0; // 人还需要干其他事 15 | }; 16 | 17 | #define IPerson_iid "org.qt-project.Qt.Examples.IPerson" 18 | 19 | Q_DECLARE_INTERFACE(IPerson, IPerson_iid) 20 | 21 | #endif // PERSON_H 22 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/plugin/programmer.h: -------------------------------------------------------------------------------- 1 | #ifndef PROGRAMMER_H 2 | #define PROGRAMMER_H 3 | 4 | #include "person.h" 5 | #include 6 | 7 | class Programmer : public QObject, IPerson 8 | { 9 | Q_OBJECT 10 | Q_PLUGIN_METADATA(IID IPerson_iid FILE "programmer.json") 11 | Q_INTERFACES(IPerson) 12 | 13 | public: 14 | virtual QString name() Q_DECL_OVERRIDE; 15 | virtual void eat() Q_DECL_OVERRIDE; 16 | virtual void sleep() Q_DECL_OVERRIDE; 17 | virtual void doSomething() Q_DECL_OVERRIDE; 18 | }; 19 | 20 | #endif // PROGRAMMER_H 21 | -------------------------------------------------------------------------------- /Plugins/StylePlugin/plugin/style_plugin.h: -------------------------------------------------------------------------------- 1 | #ifndef STYLE_PLUGIN_H 2 | #define STYLE_PLUGIN_H 3 | 4 | #include 5 | #include "simple_style.h" 6 | 7 | class StylePlugin : public QStylePlugin 8 | { 9 | Q_OBJECT 10 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "simple_style.json") 11 | 12 | public: 13 | StylePlugin() {} 14 | 15 | QStyle *create(const QString &key) override 16 | { 17 | if (key.toLower() == "simplestyle") 18 | return new SimpleStyle(); 19 | 20 | return Q_NULLPTR; 21 | } 22 | }; 23 | 24 | #endif // STYLE_PLUGIN_H 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 一去丶二三里 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Plugins/PersonPlugin/app/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | void loadPlugin() 10 | { 11 | // 进入插件目录 12 | QDir pluginsDir(qApp->applicationDirPath()); 13 | pluginsDir.cd("plugins"); 14 | // 查找目录中的所有插件 15 | foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { 16 | QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); 17 | // 返回插件的根组件对象 18 | QObject *pPlugin = loader.instance(); 19 | if (pPlugin != Q_NULLPTR) { 20 | 21 | // 获取元数据(名称、版本、依赖) 22 | QJsonObject json = loader.metaData().value("MetaData").toObject(); 23 | qDebug() << "********** MetaData **********"; 24 | qDebug() << json.value("author").toVariant(); 25 | qDebug() << json.value("date").toVariant(); 26 | qDebug() << json.value("name").toVariant(); 27 | qDebug() << json.value("version").toVariant(); 28 | qDebug() << json.value("dependencies").toArray().toVariantList(); 29 | 30 | // 访问感兴趣的接口 31 | IPerson *pPerson = qobject_cast(pPlugin); 32 | if (pPerson != Q_NULLPTR) { 33 | qDebug() << "********** IPerson **********"; 34 | qDebug() << pPerson->name(); 35 | pPerson->eat(); 36 | pPerson->sleep(); 37 | pPerson->doSomething(); 38 | } else { 39 | qWarning() << "qobject_cast falied"; 40 | } 41 | } 42 | } 43 | } 44 | 45 | int main(int argc, char *argv[]) 46 | { 47 | QCoreApplication a(argc, argv); 48 | 49 | loadPlugin(); 50 | 51 | return a.exec(); 52 | } 53 | --------------------------------------------------------------------------------