![](/img/trans.png)
[英]Why a member function of Mainwindow can call a member of Qlabel in Qt
[英]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.