【发布时间】:2020-10-15 23:09:36
【问题描述】:
我有一个这样的主类
class ImagePuzzle : public QMainWindow
{
Q_OBJECT
public:
ImagePuzzle(QWidget *parent = nullptr);
~ImagePuzzle();
private:
QVector<QVector<ClickableLabel*> > imageLabelArray;
};
为了为标签创建点击事件,我遵循了这个文档:https://wiki.qt.io/Clickable_QLabel 并创建了一个这样的类:
class ClickableLabel : public QLabel {
Q_OBJECT
public:
explicit ClickableLabel(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
~ClickableLabel();
void setId (int id);
signals:
void clicked();
protected:
void mousePressEvent(QMouseEvent* event);
private:
int id;
};
如何从 ClickableLabel::mousePressEvent 调用 ImagePuzzle 中的函数,并将 ClickableLabel::id 作为参数传递?
[已编辑] 按照建议我添加了一个信号,但它不起作用。 (可以编译但不调用主类中的函数) clickablelabel.h
class ClickableLabel : public QLabel {
Q_OBJECT
public:
explicit ClickableLabel(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
~ClickableLabel();
void setId (int id);
signals:
// static void clicked();
void test (int id);
protected:
void mousePressEvent(QMouseEvent* event);
private:
int id;
};
可点击标签.cpp
void ClickableLabel::mousePressEvent(QMouseEvent* event) {
// emit clicked();
emit test(id);
}
void ClickableLabel::setId (int id) {
this->id = id;
}
imagepuzzle.h
class ImagePuzzle : public QMainWindow
{
Q_OBJECT
public:
ImagePuzzle(QWidget *parent = nullptr);
~ImagePuzzle();
public slots:
void test(int id);
private:
Ui::ImagePuzzle *ui;
QVector<QVector<ClickableLabel*> > imageLabelArray;
};
imagepuzzle.cpp
void ImagePuzzle::test (int id) {
// do something
}
【问题讨论】:
-
在鼠标按下事件中,当按下所需的按钮时,您会发出 clicked();然后像使用任何其他信号一样使用 clicked 信号。这应该有助于您检测按下的按钮:https://stackoverflow.com/q/16759544/487892
-
更准确地说,标签向量中的每个元素都有自己的 id。如果 ImagePuzzle 类中有变量 sum。每次单击标签时,如何将 id 添加到 ImagePuzzle::sum 中。
-
您需要更改信号以获取参数,然后使用参数发出该信号。也许
void labelClicked( int id)然后在你的 mousePressEventemit labelClicked(id) -
存在多种解决方案: 1. 在构造函数中将
ImagePuzzle对象传递给ClickableLabel2. 使用信号和槽将clicked与ImagePuzzle中的槽连接 3. ... -
你会推荐哪一个?