C++ C++;,QT。QShortcut的函数调用不存在

C++ C++;,QT。QShortcut的函数调用不存在,c++,qt,pointers,forward-declaration,C++,Qt,Pointers,Forward Declaration,我有一个类,带有指向画布指针的MainWindow,mCanvas 主窗口 #include "canvas.h" class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); //snip private: Canvas* mCanvas; }; 帆布。h class MainWindow; class Canvas { pub

我有一个类,带有指向画布指针的MainWindow,mCanvas

主窗口

#include "canvas.h"


class MainWindow : public QMainWindow
{
Q_OBJECT

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

//snip

private:
    Canvas* mCanvas;
};
帆布。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
}
在MainWindow.cpp中,在MainWindow构造函数中,我将mCanvas指向画布(如下所示)。然后,我尝试使用操作Canvas::doSomething()创建一个新的QShortcut

主窗口

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

    new QShortcut(QKeySequence(Qt::Key_BracketLeft),
              mCanvas, SLOT(doSomething()) );
但是,当我试图运行该程序时,我收到错误:doSomething()没有匹配的函数调用,这意味着编译器认为doSomething()不存在。在新的QShortcut中,我将mCanvas编写为mCanvas、*mCanvas、&mCanvas;什么都不管用


出什么事了

要在画布中使用信号和插槽,您需要从
QObject
继承它(在您的情况下,从
QWidget
继承),并使用
Q_OBJECT
宏。此外,在
新QShortcut…
中使用之前,您的mCanvas未初始化

或者像这样做:

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