如果你能帮助我解决这个问题,我将非常感激:
我有一个名为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() {
}
我是个乞丐,所以请放纵。我确信我的代码中存在很多错误。
非常感谢任何帮助。
度过愉快的一天。
答案 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
(元对象编译器),它会自动创建一些额外的方法实现(例如,用于信号和元对象处理。)