将 QPushButton 连接到同一 class 中的函数

connect QPushButton to a function inside a the same class

我想将 QPushButton 连接到同一 class 中的函数。 class 只是一个 QGridLayout,通过代码生成 ui。我不知道该怎么办。实际上我不知道在 QObject::connect.

中为 reciever 参数输入什么

我不想使用一堆 hcpp 文件,以便代码尽可能简单易读。

这是我的 main.cpp 文件:

#include <QApplication>
#include <QtWidgets>
#include <iostream>
using namespace  std;

class ConnectPage
{
public:
    void login_clicked(){
        cout<<"login pressed"<<endl;
    }
    QGridLayout *main_layout = new QGridLayout;
    // user interface Labels
    QLabel *username_label = new QLabel("username");
    QLabel *password_label = new QLabel("password");
    QLabel *host_label = new QLabel("host");
    QLabel *port_label = new QLabel("port");
    QLabel *status_bar = new QLabel;
    // user interface lineedits
    QLineEdit *username_lineedit = new QLineEdit;
    QLineEdit *password_lineedit = new QLineEdit;
    QLineEdit *host_lineedit = new QLineEdit;
    QLineEdit *port_lineedit = new QLineEdit;
    // user interface buttons
    QPushButton *login = new QPushButton("Connect");
    QPushButton *reset = new QPushButton("Clear form");
    ConnectPage()
    {
        QObject::connect(login, SIGNAL(clicked()), &app, SLOT(login_clicked()));
        main_layout->addWidget(username_label,0,0,1,1);
        main_layout->addWidget(username_lineedit,0,1,1,1);
        main_layout->addWidget(password_label,1,0,1,1);
        main_layout->addWidget(password_lineedit,1,1,1,1);
        main_layout->addWidget(host_label,2,0,1,1);
        main_layout->addWidget(host_lineedit,2,1,1,1);
        main_layout->addWidget(port_label,3,0,1,1);
        main_layout->addWidget(port_lineedit,3,1,1,1);
        main_layout->addWidget(reset,4,0,1,1);
        main_layout->addWidget(login,4,1,1,1);
        main_layout->addWidget(status_bar,5,0,1,2);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget *window = new QWidget;
    ConnectPage start_connecting;
    QGridLayout *main_layout = start_connecting.main_layout;
    window->setLayout( main_layout );
    window->setWindowTitle("Login Page");
    window->show();
    return app.exec();
}

这里是 .pro 文件:

QT += core gui widgets

SOURCES += \
    main.cpp \

HEADERS += \

任何仅涉及这两个文件的帮助将不胜感激。

如果您使用的是 Qt <= 15.2,我认为您应该从阅读带有信号和槽的 Qt 资源开始。 link

简单的答案是:

  1. 你的 class 应该从 Qobject 继承,你应该把 QObject makro 放在这个 class 的顶部和私有部分。
class example : public QObject
{
    Q_OBJECT

public: ...
public slots: ...
private: ...

};
  1. function即slot,应该在public slots:段中一个class。喜欢:
public slots:
void login_clicked(){
        cout<<"login pressed"<<endl;
    }
  1. 您可以像这样在 class 构造函数中捕获此函数:
connect(login, &QPushButton::pressed, this, &ConnectPage::login_clicked);

您可以在 connect.

中使用 lambda 表达式
connect(login, &QPushButton::pressed, [&](){
    cout<<"login pressed"<<endl;
});

最后一句话。如果你想使用你现在拥有的语法,你需要记住函数签名。从文档: “关于是否在 SIGNAL() 和 SLOT() 宏中包含参数的规则是,如果参数具有默认值,则传递给 SIGNAL() 宏的签名不得少于传递给SLOT() 宏。"

所以这个语法应该有效:

connect(login, SIGNAL( clicked(bool)), this, SLOT(login_clicked()));

但我不喜欢这种语法。

此致!