2017-08-23 1 views
0

Ich habe eine Klasse, Mainwindow mit einem Zeiger auf eine Leinwand, mCanvas ...C++, QT. Funktionsaufruf für QShortcut existiert nicht

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, innerhalb der M ainWindow-Konstruktor, ich zeige mCanvas auf ein Canvas (this). Ich versuche dann, einen neuen QShortcut mit der Aktion Canvas :: doSomething() zu erstellen.

mainwindow.cpp ...

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

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

Allerdings, wenn ich versuchen, das Programm auszuführen, Ich erhalte den Fehler NO CALL-Abgleichsfunktion für doSomething(), wird der Compiler bedeutet nicht denken, dass doSomething() existiert. Im neuen QShortcut habe ich mCanvas als mCanvas, * mCanvas, & mCanvas; nichts funktioniert.

Was läuft falsch?

Antwort

0

Um Signale und Slots in Canvas zu verwenden, müssen Sie es von QObject (von QWidget in Ihrem Fall) erben und Q_OBJECT Makro verwenden. Auch Ihr mCanvas wird vor der Verwendung in new QShortcut ... nicht initialisiert.

Oder etwas tun, wie folgt aus:

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