继承自QLabel的类,为什么不调用自定义槽?

问题描述 投票:1回答:3

我让班级继承自QLabel。这个类也有公共插槽,应该更改标签标题。我用按钮的clicked() SIGNAL“呼叫”这个SLOT。所以当我按下按钮时没有任何反应。

#include <QApplication>
#include <QLabel>
#include <QPushButton>

class Label : public QLabel
{
public:
    Label(QString a) : QLabel(a){}

public slots:
    void change()
    {
        this->setNum(2);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton* button = new QPushButton("Button");
    Label* lbl = new Label("Label");

    button->show();
    lbl->show();

    QObject::connect(button, SIGNAL(clicked(bool)), lbl, SLOT(change()));

    return a.exec();
}

如何从插槽中更改标题?

c++ qt qt5 qlabel qt-signals
3个回答
2
投票

为了识别信号和槽,类必须在私有部分中使用Q_OBJECT宏。

另一件事是包括"main.moc",有关这一点的更多信息,请阅读this

#include <QApplication>
#include <QLabel>
#include <QPushButton>

class Label : public QLabel
{
    Q_OBJECT
public:
    Label(const QString &text, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()) :
     QLabel(text, parent, f){}

public slots:
    void change()
    {
        setNum(2);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton* button = new QPushButton("Button");
    Label* lbl = new Label("Label");

    button->show();
    lbl->show();

    QObject::connect(button, SIGNAL(clicked()), lbl, SLOT(change()));

    return a.exec();
}

#include "main.moc"

在进行这些更改结束时,您必须执行以下操作:

  1. 在Build菜单中按all all。
  2. 然后在同一菜单中运行qmake。
  3. 而你只是撰写你的项目。

0
投票

尝试从你的连接调用中获取返回值,检查它是真还是假。将Q_OBJECT宏添加到派生类的开头。添加一些调试输出到您的插槽,如

qDebug()<<"This is my slot.";

也许这会有助于进一步发展。

最好的祝福


0
投票

之后添加Q_OBJECT

class Label : public QLabel
{

然后你应该

要么将Label类声明放在.h文件中,要么在#include "main.moc"函数声明后写main

© www.soinside.com 2019 - 2024. All rights reserved.