将 QPushButton 连接到同一 class 中的函数
connect QPushButton to a function inside a the same class
我想将 QPushButton
连接到同一 class 中的函数。 class 只是一个 QGridLayout
,通过代码生成 ui
。我不知道该怎么办。实际上我不知道在 QObject::connect
.
中为 reciever
参数输入什么
我不想使用一堆 h
和 cpp
文件,以便代码尽可能简单易读。
这是我的 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
简单的答案是:
- 你的 class 应该从 Qobject 继承,你应该把
QObject
makro 放在这个 class 的顶部和私有部分。
class example : public QObject
{
Q_OBJECT
public: ...
public slots: ...
private: ...
};
- function即slot,应该在
public slots:
段中一个class。喜欢:
public slots:
void login_clicked(){
cout<<"login pressed"<<endl;
}
- 您可以像这样在 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()));
但我不喜欢这种语法。
此致!
我想将 QPushButton
连接到同一 class 中的函数。 class 只是一个 QGridLayout
,通过代码生成 ui
。我不知道该怎么办。实际上我不知道在 QObject::connect
.
reciever
参数输入什么
我不想使用一堆 h
和 cpp
文件,以便代码尽可能简单易读。
这是我的 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
简单的答案是:
- 你的 class 应该从 Qobject 继承,你应该把
QObject
makro 放在这个 class 的顶部和私有部分。
class example : public QObject
{
Q_OBJECT
public: ...
public slots: ...
private: ...
};
- function即slot,应该在
public slots:
段中一个class。喜欢:
public slots:
void login_clicked(){
cout<<"login pressed"<<endl;
}
- 您可以像这样在 class 构造函数中捕获此函数:
connect(login, &QPushButton::pressed, this, &ConnectPage::login_clicked);
您可以在 connect
.
connect(login, &QPushButton::pressed, [&](){
cout<<"login pressed"<<endl;
});
最后一句话。如果你想使用你现在拥有的语法,你需要记住函数签名。从文档: “关于是否在 SIGNAL() 和 SLOT() 宏中包含参数的规则是,如果参数具有默认值,则传递给 SIGNAL() 宏的签名不得少于传递给SLOT() 宏。"
所以这个语法应该有效:
connect(login, SIGNAL( clicked(bool)), this, SLOT(login_clicked()));
但我不喜欢这种语法。
此致!