QT:没有这样的插槽-这里的新手

QT : No such slot - Newbie here

本文关键字:插槽 这里 新手 QT      更新时间:2023-10-16
#include "mainwindow.h"
#include <QApplication>
#include "QProgressBar"
#include "QPushButton"
#include "QHBoxLayout"
#include "QLabel"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *mainw = new QWidget;
mainw->setWindowTitle("Progress Increase");
QHBoxLayout *layout = new QHBoxLayout();
QPushButton *button = new QPushButton("PRESS TO INCREASE");
QLabel *newlabel = new QLabel();
newlabel->setText("WILL CHANGE HERE");
QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText("GAMA     GAMA")));
layout->addWidget(button);
layout->addWidget(newlabel);
mainw->setLayout(layout);
mainw->show();
return a.exec(); 
}

QT给出以下错误。我是新手QObject::connect: No such slot QLabel::setText("GAMA GAMA") in. Gaamamain.cpp:18

我建议您查看QObject::connect上的文档。Qt有一个非常好的文档,很容易浏览和理解。

你得到这个错误是因为QObject::connect的参数是-发出信号的物体-发出的信号-接收对象-和接收方法,称为插槽你不能传递参数值给信号和槽,只传递它们的类型。此外,槽接受的参数类型的数目必须等于或少于信号的数目。

例如你的代码
QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText("GAMA     GAMA")));

应为

QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText()));

,但这又会是错误的,因为没有方法QLable::setext()我想你要找的是

QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(someSlot()));

然后定义someslot(),并在其中设置标签的文本为您想要的。

QObject::连接(按钮、信号(按()),newlabel,槽(setText("伽马伽马"));

如果你想为QPushButton::pressed()事件创建一个处理程序,即在按钮被按下后,标签文本应该被改变,你可以

// Create a halper that transforms pressed() signal to textChanged(text) signal
// that will be connected to setText() slot, i.e.
// button.pressed() -> proxy.onButtonPressed() -> label.setText(text)
//
class SignalHelper : public QObject {
    Q_OBJECT
    QString  text_;
public:
    SignalHelper(const QString & text)
            : text_(text) {
    }
signals:
    void textChanged(const QString & text);
public slots:
    void onButtonPressed() {
        emit textChanged(text_);
    }
};
int main(int argc, char *argv[]) {
...
// Connect
//
QScopedPointer<SignalHelper> pHelper(new SignalHelper(QStringLiteral("GAMA     GAMA")));
QObject::connect(button, &QPushButton::pressed,
                 pHelper.data(), &SignalHelper::onButtonPressed);
QObject::connect(pHelper.data(), &SignalHelper::textChanged,
                 newlabel, &QLabel::setText);
...
// Also you can add another button that sets another text
//
QPushButton *button2 = new QPushButton("PRESS TO DECREASE");
QScopedPointer<SignalHelper> pHelper2(new SignalHelper(QStringLiteral("Decreased")));
QObject::connect(button2, &QPushButton::pressed,
                 pHelper2.data(), &SignalHelper::onButtonPressed);
QObject::connect(pHelper2.data(), &SignalHelper::textChanged,
                 newlabel, &QLabel::setText);
...
}

另一种方法是使用信号处理程序+ std::bind()——在这种情况下,您不需要在helper类中定义任何特定的信号,因此您可以将任何处理程序附加到pressed()信号上。

typedef std::function<void()> Handler_t;
class BtnPressHandler : public QObject {
    Q_OBJECT
    Handler_t  handler_;
public:
    BtnPressHandler(Handler_t handler)
            : handler_(handler) {
    }
public slots:
    void onButtonPressed() {
        handler_();
    }
};
// Connect
//
QScopedPointer<BtnPressHandler> pHandler(new BtnPressHandler(
        std::bind(&QLabel::setText, newlabel, QStringLiteral("GAMA     GAMA"))));
QObject::connect(button, &QPushButton::pressed,
                 pHandler.data(), &BtnPressHandler::onButtonPressed);
// Create a button that closes an application
//
QPushButton * exitBtn = new QPushButton("PRESS TO EXIT");
QScopedPointer<BtnPressHandler> pHandler2(new BtnPressHandler(
        std::bind(&QApplication::quit, &a)));
QObject::connect(exitBtn, &QPushButton::pressed,
                 pHandler2.data(), &BtnPressHandler::onButtonPressed);