【问题标题】:Qt Call function in main class from qlabel click event来自qlabel单击事件的主类中的Qt调用函数
【发布时间】: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) 然后在你的 mousePressEvent emit labelClicked(id)
  • 存在多种解决方案: 1. 在构造函数中将ImagePuzzle 对象传递给ClickableLabel 2. 使用信号和槽将clickedImagePuzzle 中的槽连接 3. ...
  • 你会推荐哪一个?

标签: c++ qt


【解决方案1】:

按照@drescherjm 的建议并阅读https://doc.qt.io/qt-5/signalsandslots.html,我得到了一个信号和插槽解决方案:

可点击标签.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:
    void test (int id);

protected:
    void mousePressEvent(QMouseEvent* event);

private:
    int id;
};

imagepuzzle.h

class ImagePuzzle : public QMainWindow
{
    Q_OBJECT

public:
    ImagePuzzle(QWidget *parent = nullptr);
    ~ImagePuzzle();

private slots:
  void test(int id);

};

通过连接某处的信号和插槽

connect(curLabel, &ClickableLabel::test, this, &ImagePuzzle::test);

我可以使用这个与主类进行交流

emit test(id);

多么美好的一天:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2021-05-12
    • 2017-12-10
    • 2011-06-05
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多