如果您能帮助我解决这个问题,我将不胜感激:

我有一个名为Square的QPushButton子类,我想做的是通过单击Square的另一个实例来更改一个实例的图标。我有一个称为sqMatrix的正方形的指针 vector :

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

我想从main.cpp做到这一点:
QObject::connect(sqMatrix.at(0).at(0),SIGNAL(clicked())
                ,sqMatrix.at(5).at(5),SLOT(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() {
}

我是一个乞讨者,所以请放纵自己。我确定我的代码中有严重的错误。

任何帮助将不胜感激。

祝你今天愉快。

最佳答案

问题是您错过了该类中的Q_OBJECT宏。参见“HERE”箭头。

#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(元对象编译器),它会自动创建一些其他方法实现(例如用于信号和元对象处理)。

关于c++ - Qt C++:使用Signals/Slots链接QPushButton子类的多个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22842176/

10-12 18:18