QT connect函数的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT connect函数的用法相关的知识,希望对你有一定的参考价值。

代码如下,connect(pushbuttonSet,SIGNAL(clicked()),chatform,SLOT(show()));//用关联实现窗口的弹出
//pushubuttonSet是按钮名称,chatform是要弹出的窗口的类
出现错误:expected constructor, destructor, or type conversion before '(' token
按照你的方法改正之后会出现这个问题
错误:'pushbuttonSet' was not declared in this scope

参考技术A connect(pushbuttonSet,SIGNAL(clicked()),this,SLOT(OnBtnSet()));

this class://就是pushbuttonSet所在的类
.h//头文件
slots:
void OnBtnSet();

.cpp
void OnBtnSet()
chatform.show();

追问

connect函数应该写在chatForm所在的类还是pushbutton所在的类?

追答

pushbutton所在的类

本回答被提问者和网友采纳

C++ - Qt QObject::connect 跨类的 GET 请求使用

【中文标题】C++ - Qt QObject::connect 跨类的 GET 请求使用【英文标题】:C++ - Qt QObject::connect GET request usage across classes 【发布时间】:2012-11-28 01:16:33 【问题描述】:

快速概览正在发生的事情:我正在尝试使用 Qt 的 QNetworkAccessManager 发出 GET 请求,但我的 QObject::connect(..) 函数上的回调函数没有被调用。我的问题是我可以从一个对象调用QObject::connect,但连接到另一个对象的插槽(假设我有一个指向对象和插槽的指针) - 请参阅下文了解更多详细信息。

我的最终目标是发布数据(因为它是一个登录函数),我的 POST 请求代码最终遇到了同样的问题 - 回调函数没有被调用。所以我希望能够先做一个简单的 GET 请求,一旦我有了它,我想我自己就可以了。

我目前有一个 QMainWindow LoginWindow,在 LoginWindow 类中有一个调用插槽 doLogin() 的按钮。这一切都如您所料。 LoginWindow 也有一个名为loginResponse(QNetworkReply* response)public slots 函数。

//---LoginWindow.h

...

public slots:
    void doLogin();
    void loginResponse(QNetworkReply* response)

...

//---LoginWindow.cpp

LoginWindow::LoginWindow(QWidget *parent) :
    QMainWindow(parent),
ui(new Ui::LoginWindow)

    ui->setupUi(this);
    ui->username_le->setFocus();


void LoginWindow::doLogin()

   MyProduct::Network network(this);
    qDebug() << "Logging in...";

    //Here I call network.login from LoginWindow and pass 
    //references to the Slot I want to use and the LoginWindow itself
    network.login(
        ui->username_le->text(), //username
        ui->password_le->text(), //password
        this,                    //reference to this object (LoginWindow*)
        SLOT(loginResponse(QNetworkReply*)) //loginResponse slot
    );


void LoginWindow::loginResponse(QNetworkReply* response)

    qDebug() << "Log in complete";

接下来我有另一个类,在MyProduct 命名空间下,称为Network。如上所示,Network 有一个名为 login 的函数。这里是:

void MyProduct::Network login(QString username, QString password, QObject *receiver, const char *slot)

    QNetworkRequest request(QUrl(API_ROOT + LOGIN_PATH)); //"http://localhost/basic/login.php"
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");

    //nam = QNetworkAccessManager* declared in the constructor
    QObject::connect(nam,SIGNAL(finished(QNetworkReply*)), receiver, slot);

    qDebug() << "Posting login data...";
    nam->get(request);

这里的目标是在我的Network 类中创建一个登录函数,该函数可以在任意数量的窗口中使用和连接(因为用户可以从多个位置登录)。但我没有得到任何回应 - LoginWindow::loginResponse 没有运行。

我在控制台中看到“正在登录...”和“正在发布登录数据”输出,但没有看到“登录完成”。

谁能指出我正确的方向或告诉我我疯了或这是一个坏主意?

提前致谢!

【问题讨论】:

【参考方案1】:

请注意,QNetworkAccessManager 是异步操作的。 get() 方法在网络操作发生时不会阻塞;它立即返回。 (有关详细信息,请参阅文档的 Detailed Description 部分。)

这是非常典型的 Qt 网络相关 API,因为您通常不希望应用程序在等待数据通过网络移动时冻结。

这意味着您的实例 nam 的存活时间不足以让 GET 请求真正完成。 Product::Network 类的实例在调用login() 后立即被删除,因为它是在堆栈上分配的。虽然我看不到代码,但我猜它也会清理QNetworkAccessManager

如果您延长 network 对象的生命周期,您可能会发现您的插槽最终会被调用。


另外,这更多是一个偏好问题,但我认为避免将接收器和插槽传递给您的 login() 函数会更干净。我建议在 Network 类中声明您自己的信号作为其 API 的一部分,并连接到 LoginWindow 类中的信号。

【讨论】:

就是这样! nam 仅在本地范围内,并在请求返回之前被销毁。非常感谢你。我现在正在考虑为我的 Network 课程制作自己的信号。

以上是关于QT connect函数的用法的主要内容,如果未能解决你的问题,请参考以下文章

Oracle函数sys_connect_by_path用法

关于Qt中的信号槽连接connect函数

connect()的函数说明

connect函数中参数

关于winsock2中的connect函数

qt connect 用法 涉及Lambda