首页 > 解决方案 > 我可以在不创建类的情况下创建一个插槽吗?

问题描述

只是一个简单的程序来说明更大的问题。我要做的是在不使用任何类的情况下为信号/插槽连接创建一个函数。我是 OOP 的新手,目前不想与课程有关。所以,我在函数之前创建了一个函数,main并希望这会起作用......但它没有。prog 可以编译和执行,但我收到一个通知:Object::connect: No such slot QTextEdit::onClicked(). 我预计这个问题可以很容易地解决,因为它是表达上的错误而不是理解上的错误,所以在此先感谢您的帮助!:)

#include <QtGui>
#include <QtCore>

    void onClicked (QTextEdit text, QString a)
    {
        text.setText(a);
    }

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

        QWidget mw;
        mw.setWindowTitle("Main Window");
        mw.resize(400, 400);
        mw.show();

        QLabel label ("Enter something:", &mw);
        label.setAlignment(Qt::AlignHCenter);
        label.show();

        QLineEdit line (&mw);
        line.show();

        QString a = line.text();

        QTextEdit text (&mw);
        text.show();

        QPushButton btn ("Convert", &mw);
        QObject::connect(
        &btn,
        SIGNAL(clicked()),
        &text,
        SLOT(onClicked()));
        btn.show();

        QVBoxLayout layout_mw;

        layout_mw.addWidget(&label);
        layout_mw.addWidget(&line);
        layout_mw.addWidget(&btn);
        layout_mw.addWidget(&text);

        mw.setLayout(&layout_mw);

        return app.exec();
    }

标签: c++qt

解决方案


好吧,确实插槽仅在 QObjects 中可用,但您也可以肯定地将信号连接到 lambdas :)

因此,在这种情况下,您可以使用有用的 lambda 并省略自定义函数

void onClicked (QTextEdit text, QString a) :

喜欢

QObject::connect(&btn, &QPushButton::clicked,
    [](QTextEdit te, QString s){qDebug() << "am in...";});

推荐阅读