簡體   English   中英

主類中的 Qt 調用函數來自 qlabel 單擊事件

[英]Qt Call function in main class from qlabel click event

我有一個這樣的主班

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::id 作為參數從 ClickableLabel::mousePressEvent 調用 ImagePuzzle 中的函數?

[已編輯] 按照建議我添加了一個信號,但它不起作用。 (可以編譯但不調用主類中的函數) 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;
};

clickablelabel.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;
};


圖像拼圖.cpp

void ImagePuzzle::test (int id) {
    // do something
}

按照@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);

多么美好的一天:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM