QT 插件案例: echoplugin
- 注:此案例为qt官方案例
目录
- 显示结果:
- 目录结构
- echoplugin.pro
TEMPLATE = subdirs SUBDIRS = echowindow \ plugin
echopluginwindow
- echopluginwindow.pro
QT += widgets HEADERS = echowindow.h \ echointerface.h SOURCES = echowindow.cpp \ main.cpp TARGET = echoplugin QMAKE_PROJECT_NAME = echopluginwindow win32 { CONFIG(debug, release|debug):DESTDIR = ../debug/ CONFIG(release, release|debug):DESTDIR = ../release/ } else { DESTDIR = ../ } # install target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/echoplugin INSTALLS += target CONFIG += install_ok # Do not cargo-cult this!
- echointerface.h
#ifndef ECHOINTERFACE_H #define ECHOINTERFACE_H #include <QObject> #include <QString> class EchoInterface { public: virtual ~EchoInterface() = default; virtual QString echo(const QString &message) = 0; }; QT_BEGIN_NAMESPACE #define EchoInterface_iid "org.qt-project.Qt.Examples.EchoInterface" Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_iid) QT_END_NAMESPACE #endif
- echowindow.h
#ifndef ECHODIALOG_H #define ECHODIALOG_H #include <QWidget> #include "echointerface.h" QT_BEGIN_NAMESPACE class QString; class QLineEdit; class QLabel; class QPushButton; class QGridLayout; QT_END_NAMESPACE class EchoWindow : public QWidget { Q_OBJECT public: EchoWindow(); private slots: void sendEcho(); private: void createGUI(); bool loadPlugin(); EchoInterface *echoInterface; QLineEdit *lineEdit; QLabel *label; QPushButton *button; QGridLayout *layout; }; #endif
- echowindow.cpp
#include "echowindow.h" #include <QCoreApplication> #include <QDir> #include <QLabel> #include <QLayout> #include <QLineEdit> #include <QMessageBox> #include <QPluginLoader> #include <QPushButton> EchoWindow::EchoWindow() { createGUI(); setLayout(layout); setWindowTitle("Echo Plugin Example"); if (!loadPlugin()) { QMessageBox::information(this, "Error", "Could not load the plugin"); lineEdit->setEnabled(false); button->setEnabled(false); } } void EchoWindow::sendEcho() { QString text = echoInterface->echo(lineEdit->text()); label->setText(text); } void EchoWindow::createGUI() { lineEdit = new QLineEdit; label = new QLabel; label->setFrameStyle(QFrame::Box | QFrame::Plain); button = new QPushButton(tr("Send Message")); connect(lineEdit, &QLineEdit::editingFinished, this, &EchoWindow::sendEcho); connect(button, &QPushButton::clicked, this, &EchoWindow::sendEcho); layout = new QGridLayout; layout->addWidget(new QLabel(tr("Message:")), 0, 0); layout->addWidget(lineEdit, 0, 1); layout->addWidget(new QLabel(tr("Answer:")), 1, 0); layout->addWidget(label, 1, 1); layout->addWidget(button, 2, 1, Qt::AlignRight); layout->setSizeConstraint(QLayout::SetFixedSize); } bool EchoWindow::loadPlugin() { QDir pluginsDir(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"); const QStringList entries = pluginsDir.entryList(QDir::Files); for (const QString &fileName : entries) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); if (plugin) { echoInterface = qobject_cast<EchoInterface *>(plugin); if (echoInterface) return true; pluginLoader.unload(); } } return false; }
plugin
- plugin.pro
#! [0] TEMPLATE = lib CONFIG += plugin QT += widgets INCLUDEPATH += ../echowindow HEADERS = echoplugin.h SOURCES = echoplugin.cpp TARGET = $$qtLibraryTarget(echoplugin) DESTDIR = ../plugins #! [0] EXAMPLE_FILES = echoplugin.json # install target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/echoplugin/plugins INSTALLS += target CONFIG += install_ok
- echoplugin.h
#ifndef ECHOPLUGIN_H #define ECHOPLUGIN_H #include <QObject> #include <QtPlugin> #include "echointerface.h" class EchoPlugin : public QObject, EchoInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" FILE "echoplugin.json") Q_INTERFACES(EchoInterface) public: QString echo(const QString &message) override; }; #endif
- echoplugin.cpp
#include "echoplugin.h" QString EchoPlugin::echo(const QString &message) { return message; }
QT 插件案例 echoplugin [转]
最新推荐文章于 2023-06-04 22:50:13 发布