C++ 我可以在不创建类的情况下创建插槽吗?

C++ 我可以在不创建类的情况下创建插槽吗?,c++,qt,C++,Qt,只是一个简单的程序,用一个更大的程序来说明这个问题。我试图做的是在不使用任何类的情况下为信号/插槽连接创建一个函数。我是OOP新手,现在不想去上课。因此,我在main函数之前创建了一个函数,希望它能起作用。。。但事实并非如此。该程序可以编译和执行,但我收到一个通知:Object::connect:没有这样的插槽qtexted::onClicked()。我预计这个问题很容易解决,因为这是一个表达错误,而不是理解错误,所以提前感谢您的帮助!:) #包括 #包括 单击void(QTextEdit文本,

只是一个简单的程序,用一个更大的程序来说明这个问题。我试图做的是在不使用任何类的情况下为信号/插槽连接创建一个函数。我是OOP新手,现在不想去上课。因此,我在
main
函数之前创建了一个函数,希望它能起作用。。。但事实并非如此。该程序可以编译和执行,但我收到一个通知:
Object::connect:没有这样的插槽qtexted::onClicked()
。我预计这个问题很容易解决,因为这是一个表达错误,而不是理解错误,所以提前感谢您的帮助!:)

#包括
#包括
单击void(QTextEdit文本,QString a)
{
text.setText(a);
}
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
qmw;
mw.setWindowTitle(“主窗口”);
分子量(400400);
mw.show();
QLabel标签(“输入某物:”、&mw);
label.setAlignment(Qt::AlignHCenter);
label.show();
QLineEdit行(&mw);
line.show();
QString a=line.text();
QTextEdit文本(&mw);
text.show();
QPushButton btn(“转换”、&mw);
QObject::connect(
&btn,
信号(单击()),
&文本,
插槽(onClicked());
btn.show();
QVBoxLayout\u mw;
布局\ mw.addWidget(&标签);
布局\ mw.addWidget(&line);
布局\ mw.addWidget(&btn);
布局\u mw.addWidget(&text);
mw.设置布局和布局(mw);
返回app.exec();
}

您可以在Qt文档中阅读:

从QObject或其子类之一继承的所有类(例如。, QWidget)可以包含信号和插槽


因此,无法在main.cpp中定义插槽。你有两个选择。定义从QObject派生的类并在其中添加插槽,或者使用Qt 5.*并使用新的连接语法将信号连接到lambda。

当然,插槽仅在QObject中可用,但您也可以确保将信号连接到lambda:)

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

单击后无效(QTextEdit文本,QString a):

QObject::connect(&btn,&QPushButton::单击,

[](QTextEdit te,QString s){qDebug()Hi@Nejat,首先我要感谢您从昨天起对我的帮助:d您的答案一直很有帮助,昨天我非常努力地创建一个类,我似乎做了所有正确的事情,但我得到的是一个错误“本地类中的成员模板声明无效”…然后我放弃了,试图通过在类外创建一个槽来“作弊”…正如你所说的那样,这是行不通的。你能帮我创建一个类吗?我已经有了我的代码,但我不理解这个模板的内容…我可以将代码发送给你。我决定转到Qt 5并使用lambda:)有没有什么有用的技巧可以用来更改Qt5,例如,我应该更改一些标题?我也可以在Qt4.8中这样做吗?希望如此:)@val我很抱歉,但是这个功能只有Qt5+才有:@cbuchart我知道,没关系:)我已经决定要移动到Qt5了,你能为bash(Ubuntu)建议一个命令吗要做到这一点?可能问题多于好处…更改项目并修复编译问题。我没有将项目移动得太大(大多数项目从一开始就作为Qt5启动),但总的来说,我认为大多数事情都与不推荐的方法有关……这是transition@cbuchart你完全正确!我现在想改为Qt5,但正如我看到的,在那里使用西里尔编码有很多问题,因为一个非常有用的方法已经完全消失了,所以我必须继续使用Qt4…这意味着对我来说,我无法使用lambda:(将必须处理类。。。
#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();
    }
QObject::connect(&btn, &QPushButton::clicked,
    [](QTextEdit te, QString s){qDebug() << "am in...";});