【发布时间】:2018-06-18 08:46:22
【问题描述】:
我想开发一个基于插件的 Qt 应用程序。
作为应用程序的一部分,插件应该能够将工具栏或小部件添加到应用程序的主窗口。 我认为插件的工具栏应该在插件的实现中创建并传递给 MainWindow。
Refer this link:Qt object management with Qt Plugins我写我的代码。
我使用on_Action_triggered()(function no param) 作为插槽来接收工具栏动作triggered() 的信号,然后将动作addShapeAction 连接到on_Action_triggered(),使用:
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()))
但是我在构建代码时遇到了一些错误。 enter image description here 如:
C:\Qt\Qt5.10.1\5.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);
}
【问题讨论】:
-
@Wafflesys 我已经更改了
on_action_triggered(bool flag),也没有用。 -
完全改变是什么意思?您在函数中添加了 bool 参数?如果是这样,那么它们应该不再是信号/插槽签名不匹配错误。
-
@Wafflesys 我多次尝试更改函数 on_action_triggered() 的定义,添加 bool parma,对同一问题不起作用,删除它,不起作用,一遍又一遍。
-
添加 bool 参数后的代码和错误是什么?连接应该是
connect(addShapeAction, SIGNAL(triggered(bool)), this, SLOT(on_Action_triggered(bool)));,并更改函数声明和定义以添加该布尔参数。还修复了我们可以在您的错误图像中看到的其他问题,例如您使用 .而不是->。然后告诉我们你得到了什么。 -
@Wafflesys 这是错误的,这不是问题所在。插槽的参数可以少于信号的参数。
void triggered(bool)信号肯定与void on_action_triggered()插槽兼容。问题出在其他地方。