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

Qt C++ : Linking multiple instances of a QPushButton subclass using Signals/Slots

本文关键字:子类 QPushButton 实例 链接 插槽 C++ 信号 Qt      更新时间:2023-10-16

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

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

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

我想从主要方面做到这一点.cpp :

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

我尝试了很多事情,做了很多研究,但我不知道如何正确地做到这一点。

在这里我遇到了错误:

QObject::connect: no so slot QPushButton::d iscoverThis()

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

平方 :

#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

方形.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宏。请参阅"此处"箭头。

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