如何在Qt5中从SLOT返回值?

时间:2017-05-20 06:49:46

标签: c++ qt qt5 qt-signals qtwidgets

我是Qt环境的新手。我最近开始使用QtCreator项目进行简单的聊天应用程序(QMainWindow)。我几乎完成了这个项目,但坚持使用SIGNAL/SLOT problem

让我简要解释一下我的问题:

  

由于代码的长度,我无法将其粘贴到此处。

  1. 我有两个课程MainWindowNetworkFile
  2. NetworkFile中的函数newServerConn()将信号readyRead()连接到广告位readFromClient()
  3. 客户返回的字符串存储在QString SLOT中的readFromClient()
  4. 问题:

    我必须将插槽中的QString返回到newServerConn()函数并从那里返回到MainWindow类中的函数,因为只有这样我才能将字符串打印到{{1} } plainLineEdit对象指向的小部件。

    问题1: 如何从插槽中返回值?

    问题2: 或者有什么方法可以在ui类中获取ui实例的副本,以便我可以使用那里的小部件?

    感谢。

2 个答案:

答案 0 :(得分:1)

来自documentation

  

Signals [...]永远不会有返回类型(即使用void)。

因此,当通过信号调用时,插槽返回类型是无用的(即使您在直接调用插槽时仍然可以使用它们,即如果它是成员函数)。

话虽如此,您可以通过引用或插槽中的地址(即,如果它是lambda)捕获ui甚至更好plainLineEdit并从那里正确设置字符串。

答案 1 :(得分:1)

我只是将数据作为信号发出,然后连接新信号和插槽之间的连接,然后将字符串添加到你的ui。

一个快速自包含的例子(顺便说一句。"由于代码的长度,我无法将其粘贴在这里。"只是一个借口,你几乎总是可以减少你的相关代码)

部首:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTextEdit>

class NetworkFile;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow(){}

public slots:
    void addText(QString str)
    {
        edit->append(str);
    }

private:
    QTextEdit* edit;
    NetworkFile* net;
};

class NetworkFile : public QObject
{
    Q_OBJECT

public:
    NetworkFile(QObject *parent = 0):
        QObject(parent)
    {
        connect(&server, &QTcpServer::newConnection,
                this, &NetworkFile::newConnection);
        //TODO: check return value
        server.listen(QHostAddress::Any,16001);
    }

signals:
    void dataRead(QString);

public slots:
    void newConnection(){
        //TODO: wire up socket disconnect with deleteLater, also check for null
        QTcpSocket* socket = server.nextPendingConnection();
        connect(socket, &QTcpSocket::readyRead,
                this, &NetworkFile::dataAvailable);
    }

    void dataAvailable(){
        //HACK: only for brevity, create a connection wrapper that contains the socket in real code
        QTcpSocket* source = (QTcpSocket*)sender();

        auto bytes = source->readAll();
        if(bytes.size())
        {
            emit dataRead(QString(bytes));
        }
    }

private:
    QTcpServer server;
};

#endif // MAINWINDOW_H

cpp文件

#include "mainwindow.h"
#include <QApplication>

MainWindow::MainWindow(QWidget *parent ):
    QMainWindow(parent)
{
    edit = new QTextEdit(this);
    net = new NetworkFile(this);

    connect(net, &NetworkFile::dataRead,
            this, &MainWindow::addText );
    setCentralWidget(edit);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}