来自子类QGraphicsView的信号无法在SLOT

时间:2017-04-23 17:23:42

标签: c++ qt mouseevent qgraphicsview

我有一个QGraphicsView的子类来识别鼠标事件,它确实如此。但是当这些鼠标事件发生时,我需要调用另一个类中的其他函数来处理鼠标事件与场景的交互方式。

//Subclass
class Drawspace : public QGraphicsView {
public:
    Drawspace(QGraphicsScene * scene, QWidget * parent) : QGraphicsView(scene, parent) {}
    Drawspace(QWidget* parent) : QGraphicsView(parent) {}

    void mousePressEvent(QMouseEvent * event) { 
        QMessageBox::information(this, tr("Dialog"), "You clicked the board (from QGraphicsView)");
        QWidget::mousePressEvent(event);
    }
};

//mainwindow code (my subclass is called "board")
mainwindow::mainwindow(QWidget *parent)
    : QMainWindow(parent) {

    //Initialize other stuff
    ui.setupUi(this);

    //Problem here
    connect(ui.board, SIGNAL(Drawspace::mousePressEvent(QMouseEvent*)), this, SLOT(on_click(QMouseEvent*)));
}

void mainwindow::on_click(QMouseEvent * event) {
    QMessageBox::information(this, tr("Dialog"), "You clicked the screen");
    //Do stuff here
}

它构建得很好,当我点击绘图空间时,我得到一个对话框,上面写着“你点击了电路板(来自QGraphicsView)”,但我没有从“你点击屏幕”中得到第二个。 是的,mainwindow的头文件有Q_OBJECT宏

编辑:可以通过手动定义自己的信号,调用它,并更改连接以使用Qt5语法来修复。请参阅我的代码答案

3 个答案:

答案 0 :(得分:0)

mousePressEvent()不是信号。它是一个成员函数。您不能connect()函数功能,就像您可以将信号连接到信号。

Qt信号被声明为功能,但它们得到了一些特殊处理。您需要使用Qt的关键字来表示信号,以便它可以获得使其有效的处理。

答案 1 :(得分:0)

这里的OP,可以通过定义一个信号,在其上调用emit并更改连接以使用Qt5语法来解决问题。

//New drawspace: Added signal definition and called emit on it from mousePressEvent
class Drawspace : public QGraphicsView, public QObject {
    Q_OBJECT
public:
    Drawspace(QGraphicsScene * scene, QWidget * parent) : QGraphicsView(scene, parent) {}
    Drawspace(QWidget* parent) : QGraphicsView(parent) {}
    void setObjectName(QString str) { QGraphicsView::setObjectName(str); }

    void mousePressEvent(QMouseEvent * event) {
        QMessageBox::information(this, tr("Dialog"), "Detected click in Drawspace");
        emit clicked(event);
    }

Q_SIGNALS:
    void clicked(QMouseEvent * event);
};

//Used Qt5 syntax, this will automatically pass arguments
connect(ui.board, &Drawspace::clicked, this, &mainwindow::on_click);

答案 2 :(得分:-1)

将mousePressEvent设为虚拟,或者您正在创建一个新方法:

virtual void mousePressEvent(QMouseEvent * event)

并说它被覆盖(取决于你的编译器:)

virtual void mousePressEvent(QMouseEvent * event)override(Q_DECL_OVERRIDE)