Qt5.11 app plugins build error occurs: Signal and slot arguments are not compatible 不兼容
Qt5.11 app plugins build error occurs: Signal and slot arguments are not compatible
我想开发一个基于插件的 Qt 应用程序。
作为应用程序的一部分,插件应该能够将工具栏或小部件添加到应用程序的主窗口。
我认为插件的工具栏应该在插件的实现中创建并传递给 MainWindow。
我写我的代码。
我使用 on_Action_triggered()
(函数无参数)作为插槽来接收工具栏动作 triggered()
的信号,然后将动作 addShapeAction
连接到 on_Action_triggered()
,使用:
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()))
但是我在构建代码时遇到了一些错误。
enter image description here
例如:
C:\Qt\Qt5.10.1.10.1\msvc2015\include\QtCore\qobject.h:320: error: C2338: Signal and slot arguments are not compatible.
如何解决这个问题?
有没有更好的方法来构建插件工具栏?
这里是shapeplugininterface.h
的代码
#ifndef SHAPEPLUGININTERFACE_H
#define SHAPEPLUGININTERFACE_H
#include <QObject>
#include <QString>
#include <QtWidgets/QMainWindow>
class ShapePluginInterface{
public:
virtual ~ShapePluginInterface(){}
virtual QString description() = 0;
virtual void generateShape(QString shapeType) = 0;
virtual void Initialize(QMainWindow* window);
};
#define SHAPEPLUGININTERFACE_IID "com.geolike.shapeplugininterface"
Q_DECLARE_INTERFACE(ShapePluginInterface, SHAPEPLUGININTERFACE_IID)
#endif // SHAPEPLUGININTERFACE_H
这里是basic_shape_plugin.h的代码:
#ifndef BASIC_SHAPE_PLUGIN_H
#define BASIC_SHAPE_PLUGIN_H
#include "basic_shape_plugin_global.h"
#include "shapeplugininterface.h"
#include <QtPlugin>
#include <QDebug>
#include <QtWidgets/QAction>
#include <QtWidgets/QToolBar>
class BASIC_SHAPE_PLUGINSHARED_EXPORT Basic_Shape_Plugin:
public QObject,
public ShapePluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.geolike.shapeplugininterface")
Q_INTERFACES(ShapePluginInterface)
public:
Basic_Shape_Plugin();
~Basic_Shape_Plugin();
QString description();
void generateShape(QString shapeType);
void Initialize(QMainWindow* window);
public slots:
void on_Action_triggered();
};
#endif // BASIC_SHAPE_PLUGIN_H
basic_shape_plugin.cpp 个文件:
#include "basic_shape_plugin.h"
Basic_Shape_Plugin::Basic_Shape_Plugin(){}
Basic_Shape_Plugin::~Basic_Shape_Plugin(){}
QString Basic_Shape_Plugin::description()
{
return "This is a plugin to generate shapes.";
}
void Basic_Shape_Plugin::generateShape(QString shapeType)
{
qDebug() << shapeType;
}
void Basic_Shape_Plugin::on_Action_triggered(){
this->generateShape("Action Triggered!");
}
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
QAction* addShapeAction = new QAction(window);
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()));
QToolBar* toolBar = new QToolBar;
toolBar->addAction("Shapes",addShapeAction);
window->addToolBar(toolBar);
}
您尝试使用的 addAction
方法签名与您认为的不符。
有两种方法可以修复代码。理想情况下,您应该让 addAction
为您提供一个操作 - 这就是整个便利性 API 旨在做的事情:
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
auto *toolBar = new QToolBar;
auto *addShapeAction = toolBar->addAction("Shapes");
connect(addShapeAction, &QAction::triggered, this, &Basic_Shape_Plugin::on_Action_triggered);
window->addToolBar(toolBar);
}
或者,您可以自己创建带有所需文本的操作:
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
auto *addShapeAction = new QAction("Shapes", window);
connect(addShapeAction, &QAction::triggered, this, &Basic_Shape_Plugin::on_Action_triggered);
auto *toolBar = new QToolBar;
toolBar->addAction(addShapeAction);
window->addToolBar(toolBar);
}
动作的出身并不重要 - 无论您将其创建为 window
的子级,还是 QToolBar::addAction
将其创建为 toolBar
的父级。
我想开发一个基于插件的 Qt 应用程序。
作为应用程序的一部分,插件应该能够将工具栏或小部件添加到应用程序的主窗口。 我认为插件的工具栏应该在插件的实现中创建并传递给 MainWindow。
on_Action_triggered()
(函数无参数)作为插槽来接收工具栏动作 triggered()
的信号,然后将动作 addShapeAction
连接到 on_Action_triggered()
,使用:
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()))
但是我在构建代码时遇到了一些错误。 enter image description here 例如:
C:\Qt\Qt5.10.1.10.1\msvc2015\include\QtCore\qobject.h:320: error: C2338: Signal and slot arguments are not compatible.
如何解决这个问题? 有没有更好的方法来构建插件工具栏?
这里是shapeplugininterface.h
的代码#ifndef SHAPEPLUGININTERFACE_H
#define SHAPEPLUGININTERFACE_H
#include <QObject>
#include <QString>
#include <QtWidgets/QMainWindow>
class ShapePluginInterface{
public:
virtual ~ShapePluginInterface(){}
virtual QString description() = 0;
virtual void generateShape(QString shapeType) = 0;
virtual void Initialize(QMainWindow* window);
};
#define SHAPEPLUGININTERFACE_IID "com.geolike.shapeplugininterface"
Q_DECLARE_INTERFACE(ShapePluginInterface, SHAPEPLUGININTERFACE_IID)
#endif // SHAPEPLUGININTERFACE_H
这里是basic_shape_plugin.h的代码:
#ifndef BASIC_SHAPE_PLUGIN_H
#define BASIC_SHAPE_PLUGIN_H
#include "basic_shape_plugin_global.h"
#include "shapeplugininterface.h"
#include <QtPlugin>
#include <QDebug>
#include <QtWidgets/QAction>
#include <QtWidgets/QToolBar>
class BASIC_SHAPE_PLUGINSHARED_EXPORT Basic_Shape_Plugin:
public QObject,
public ShapePluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.geolike.shapeplugininterface")
Q_INTERFACES(ShapePluginInterface)
public:
Basic_Shape_Plugin();
~Basic_Shape_Plugin();
QString description();
void generateShape(QString shapeType);
void Initialize(QMainWindow* window);
public slots:
void on_Action_triggered();
};
#endif // BASIC_SHAPE_PLUGIN_H
basic_shape_plugin.cpp 个文件:
#include "basic_shape_plugin.h"
Basic_Shape_Plugin::Basic_Shape_Plugin(){}
Basic_Shape_Plugin::~Basic_Shape_Plugin(){}
QString Basic_Shape_Plugin::description()
{
return "This is a plugin to generate shapes.";
}
void Basic_Shape_Plugin::generateShape(QString shapeType)
{
qDebug() << shapeType;
}
void Basic_Shape_Plugin::on_Action_triggered(){
this->generateShape("Action Triggered!");
}
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
QAction* addShapeAction = new QAction(window);
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()));
QToolBar* toolBar = new QToolBar;
toolBar->addAction("Shapes",addShapeAction);
window->addToolBar(toolBar);
}
您尝试使用的 addAction
方法签名与您认为的不符。
有两种方法可以修复代码。理想情况下,您应该让 addAction
为您提供一个操作 - 这就是整个便利性 API 旨在做的事情:
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
auto *toolBar = new QToolBar;
auto *addShapeAction = toolBar->addAction("Shapes");
connect(addShapeAction, &QAction::triggered, this, &Basic_Shape_Plugin::on_Action_triggered);
window->addToolBar(toolBar);
}
或者,您可以自己创建带有所需文本的操作:
void Basic_Shape_Plugin::Initialize(QMainWindow *window)
{
auto *addShapeAction = new QAction("Shapes", window);
connect(addShapeAction, &QAction::triggered, this, &Basic_Shape_Plugin::on_Action_triggered);
auto *toolBar = new QToolBar;
toolBar->addAction(addShapeAction);
window->addToolBar(toolBar);
}
动作的出身并不重要 - 无论您将其创建为 window
的子级,还是 QToolBar::addAction
将其创建为 toolBar
的父级。