【问题标题】:Calling a C++ function from Qt (slot does not work)从 Qt 调用 C++ 函数(插槽不起作用)
【发布时间】:2015-02-25 07:21:01
【问题描述】:

我用 C++ 编写了一个客户端-服务器程序。现在我必须使用 QT 来创建界面。 我已经创建了一个登录界面。当我单击登录按钮时,它应该调用 sendmessage 函数,该函数将用户名和密码发送到服务器(也是用 C++ 编写的),服务器对其进行验证并将 true 或 false 发送回 sendmessage 函数。如果是真的,窗口应该关闭并打开一个新窗口,否则它应该再次显示登录窗口,以便用户可以重试。现在,如何实现这一点,循环以及是否可以使用信号和插槽来调用 c++ 函数。关于如何做到这一点的一些想法会很好

这是我的代码的一个想法:

 Log::Log(QWidget *parent)
:QWidget(parent){

    QGridLayout *grid = new QGridLayout(this);
    grid->setSpacing(20);

    QLabel *username = new QLabel("Username", this);
    grid->addWidget(username, 0, 0, 1, 1);

    edt1 = new QLineEdit(this);
    grid->addWidget(edt1, 0, 1, 1, 3);

    QLabel *password = new QLabel("Password", this);
    grid->addWidget(password, 1, 0, 1, 1);

    edt2 = new QLineEdit(this);
    grid->addWidget(edt2, 1, 1, 1, 3);

    QPushButton *login = new QPushButton("Login", this);
    grid->addWidget(login, 3, 4, 1, 1);

    setLayout(grid);

    connect(login, SIGNAL(clicked()), this, SLOT(send_message()));

}
 //Other code


bool send_message(){
     buff = edt1->text() + edt2->text();
    write(socket, buff_send, 256); //Sends to the server
    read(socket, buff_recv, 256); //Gets the reply from the server
    if(buff_recv==true){
          loginwin.close();
          return true}
    else return false;
   }


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Login logwin;
    logwin.move(300, 300);
    logwin.setWindowTitle("LOGIN");
    window.show();
}

我知道这是完全错误的。但我希望你能明白我的意思,并提供一些技巧来说明如何做到这一点。

【问题讨论】:

  • 你能告诉我们你的错误信息吗?可能您需要声明 Q_SLOT: send_message 但在您的班级内。您将调用的每个插槽都需要注册为插槽。
  • 你可能想在主函数中QApplication::exec()你的应用程序。否则不会运行 Qt 事件循环。实际上,您的应用程序应该立即再次关闭。甚至你的主函数中的window 是什么?这根本不会编译。
  • 这段代码并不是真正的代码,它只是一种伪代码。我只需要知道如何执行上述操作。

标签: c++ qt signals-slots


【解决方案1】:

只需在头文件中注册一个 Qt 插槽。

class Log {
  ...
  Q_SLOTS:
    void sendMessage ();
}

并在实现中实现槽,例如作者:

Log::sendMessage() {
  send_message();
}

不要忘记将 connect 语句更改为 sendMessage() 函数而不是 send_message 函数。

【讨论】:

  • 好的。我能做到。但是如果我需要将参数传递给 send_message() 并获取它的返回值?插槽可以有参数吗?
  • 另外,我怎样才能让登录窗口在while循环中运行。当我这样做时,它似乎挂断了。
  • @CherryCool 当然插槽可能有参数。如果您还没有编写任何 Qt 应用程序。在提出已经回答的问题之前,请尝试各种 Qt 网站的教程。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多