首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5.11应用插件生成错误:信号和插槽参数不兼容

Qt5.11应用插件生成错误:信号和插槽参数不兼容
EN

Stack Overflow用户
提问于 2018-06-18 08:46:22
回答 1查看 622关注 0票数 1

我想开发一个基于插件的Qt应用程序

作为应用程序的一部分,插件应该能够向应用程序的MainWindow添加工具栏或小部件。我认为插件工具栏应该在插件的实现中创建并传递给MainWindow。

参考以下链接: Qt对象管理与Qt插件,我写我的代码。我使用一个on_Action_triggered()(函数no param)作为插槽来接收工具栏操作triggered()的信号,然后将操作addShapeAction连接到on_Action_triggered(),使用:

代码语言:javascript
复制
connect(addShapeAction,SIGNAL(triggered(bool)),this,SLOT(on_Action_triggered()))

但我在构建代码时遇到了一些错误。在这里输入图像描述,例如:

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
#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:的代码

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 10:37:59

您尝试使用的addAction方法签名并不能完成您认为它所做的事情。

有两种方法可以修复代码。理想情况下,您应该让addAction为您提供一个操作--这就是整个方便API设计的目的所在:

代码语言:javascript
复制
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);
}

或者,您可以自己使用所需的文本创建操作:

代码语言:javascript
复制
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的父级。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50905688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档