Qt C ++:使用信号/插槽链接QPushButton子类的多个实例

时间:2014-04-03 15:25:31

标签: c++ qt signals subclass qpushbutton

如果你能帮助我解决这个问题,我将非常感激:

我有一个名为Square的QPushButton的子类,我想要做的是通过单击另一个Square实例来更改一个实例的图标。我有一个广场指针向量的向量,称为sqMatrix:

std::vector< std::vector<Square*> > sqMatrix;

我希望从main.cpp执行此操作:

QObject::connect(sqMatrix.at(0).at(0),SIGNAL(clicked())
                ,sqMatrix.at(5).at(5),SLOT(discoverThis()));

我已经尝试了很多东西并做了很多研究,但我无法弄清楚如何正确地做到这一点。

我在这里遇到错误:

  

QObject :: connect:没有这样的插槽QPushButton :: discoverThis()

以下是相应的.h和.cpp文件:

square.h:

#ifndef SQUARE_H
#define SQUARE_H

#include <QPushButton>

class Square : public QPushButton
{
public:
    Square(const QString &text, QWidget *parent = 0);
    void mousePressEvent(QMouseEvent *e);
public slots:
    void discoverThis();
signals:
    void clicked();
};

#endif // SQUARE_H

square.cpp:

#include <QApplication>
#include <string>
#include "square.h"

#include <QMouseEvent>

Square::Square(const QString &text, QWidget *parent) : QPushButton(text,parent) {
    setFixedSize(16,16);
    setIcon(QIcon(":/images/images/square.png"));
}

void Square::mousePressEvent(QMouseEvent *e) {
    if(e->button() == Qt::LeftButton) {
        setIcon(QIcon(":/images/images/1.png"));
    }
    if(e->button() == Qt::RightButton) {
        setIcon(QIcon(":/images/images/flag.png"));
    }
}

void Square::discoverThis() {
    setIcon(QIcon(":/images/images/8.png"));
}

void Square::clicked() {
}

我是个乞丐,所以请放纵。我确信我的代码中存在很多错误。

非常感谢任何帮助。

度过愉快的一天。

1 个答案:

答案 0 :(得分:4)

问题是您错过了班级中的Q_OBJECT宏。请参阅&#34; HERE&#34;箭头。

#ifndef SQUARE_H
#define SQUARE_H

#include <QPushButton> 

class Square : public QPushButton
{
    Q_OBJECT     <---- HERE!

public:
    Square(const QString &text, QWidget *parent = 0);
    void mousePressEvent(QMouseEvent *e);

public slots:
    void discoverThis();

// +++ The signal "clicked()" is already declared in QPushButton +++
//signals:
//    void clicked();
};

#endif // SQUARE_H

QObject的每个子类都需要Q_OBJECT宏。这也会触发moc(元对象编译器),它会自动创建一些额外的方法实现(例如,用于信号和元对象处理。)