Search code examples
c++qtpointersforward-declaration

C++, QT. Function call for QShortcut does not exist


I have a class, MainWindow with a pointer to a Canvas, mCanvas...

mainwindow.h...

#include "canvas.h"


class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

//snip

private:
    Canvas* mCanvas;
};

canvas.h...

class MainWindow;


class Canvas
{
public:
    Canvas(MainWindow* parent);

    //snip

public slots:
    void doSomething();

private:
    MainWindow* mParent;  
};  

Canvas.cpp...

Canvas::Canvas(MainWindow* parent)
{
    mParent = parent;
}   

void Canvas::doSomething()
{
    //snip
}

In MainWindow.cpp, within the MainWindow constructor, I point mCanvas to an Canvas(this). I then attempt to create a new QShortcut with the action Canvas::doSomething().

MainWindow.cpp...

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {

    new QShortcut(QKeySequence(Qt::Key_BracketLeft),
              mCanvas, SLOT(doSomething()) );

However, when I attempt to run the program, I recieve the error NO MATCHING FUNCTION CALL for doSomething(), meaning the compiler does not think that doSomething() exists. In the new QShortcut, I have written mCanvas as mCanvas, *mCanvas, &mCanvas; nothing works.

What is going wrong?


Solution

  • To use signals and slots in Canvas you need to inherit it from QObject (from QWidget in your case) and use Q_OBJECT macro. Also your mCanvas is not initialized before using in new QShortcut ....

    Or do something like this:

    auto shortcut = new QShortcut(QKeySequence(Qt::Key_BracketLeft), this);
    QObject::connect(shortcut, &QShortcut::activated, this, [ this ] { mCanvas->doSomething(); } );