【问题标题】:Qt5.11 app plugins build error occurs: Signal and slot arguments are not compatibleQt5.11 app plugins build error: Signal and slot arguments is not compatible
【发布时间】: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() 插槽兼容。问题出在其他地方。

标签: c++ qt plugins toolbar


【解决方案1】:

您尝试使用的 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 的父级。

【讨论】:

  • 成功了!谢谢!和 Wafflesys,感谢您的耐心。
  • 嗨,还有一个问题。我使用第一个代码,主窗口中显示“形状”动作,但是当我单击工具栏中的“形状”动作时,没有任何输出。而在mainwindow.cpp中,调用generateShape("Rect")可以输出"Rect"!再次感谢。
  • @LIKE 一如既往:做一个小测试用例。查看我在 github 上的存储库,您可能会发现一些操作已经接近您想要的内容。您还将看到如何编写小型测试用例 - 整个存储库大部分是 50-150 行完整的 Qt 程序,其中一些并不简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2020-05-28
相关资源
最近更新 更多