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

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

我有一个 class,MainWindow 有一个指向 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
}

在 MainWindow.cpp 中,在 MainWindow 构造函数中,我将 mCanvas 指向一个 Canvas(this)。然后我尝试使用 Canvas::doSomething() 操作创建一个新的 QShortcut。

MainWindow.cpp...

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

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

但是,当我尝试 运行 程序时,我收到错误 NO MATCHING FUNCTION CALL for doSomething(),这意味着编译器认为 doSomething() 不存在。在新的QShortcut中,我把mCanvas写成mCanvas, *mCanvas, &mCanvas;没有任何效果。

出了什么问题?

要在 Canvas 中使用信号和槽,您需要从 QObject 继承它(在您的情况下是从 QWidget 继承)并使用 Q_OBJECT 宏。此外,您的 mCanvas 在 new QShortcut ....

中使用之前未初始化

或者做这样的事情:

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