【问题标题】:connect QPushButton to a function inside a the same class将 QPushButton 连接到同一类中的函数
【发布时间】:2021-04-12 22:50:45
【问题描述】:

我想将QPushButton 连接到同一个类中的一个函数。该类只是通过代码制作uiQGridLayout。我不知道该怎么办。实际上我不知道在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 += \

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

【问题讨论】:

  • 您已经将按钮连接到函数(尽管使用旧语法)。您应该编辑问题以更好地解决问题。

标签: c++ qt5 qpushbutton qobject


【解决方案1】:

如果您使用的是 Qt link

简单的答案是:

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

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

};
  1. 槽函数,应该在类的public slots:部分。喜欢:
public slots:
void login_clicked(){
        cout<<"login pressed"<<endl;
    }
  1. 您可以像这样在类构造函数中捕获此函数:
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()));

但我不喜欢这种语法。

最好的问候!

【讨论】:

  • 我认为在这种情况下插槽最好是私有的
  • 特别感谢大家@goro3,你们帮了很多忙。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2023-03-19
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多