簡體   English   中英

如何在Qt5中從SLOT返回值?

[英]How can I return a value from SLOT in Qt5?

我是Qt環境的新手。 我最近從一個用於簡單聊天應用程序(QMainWindow)的QtCreator項目開始。 我幾乎完成了該項目,但是遇到了SIGNAL/SLOT problem

讓我簡單地解釋一下我的問題:

由於代碼的長度,我無法將其粘貼到此處。

  1. 我有兩個類MainWindowNetworkFile
  2. newServerConn()的功能newServerConn()將信號readyRead()連接到插槽readFromClient()
  3. 客戶端返回的字符串存儲在readFromClient() SLOT中的QString中。

問題:

我必須將插槽中的QString返回到newServerConn()函數,然后從那里返回MainWindow類中的函數,因為只有這樣,我才能將字符串打印到ui對象指向的plainLineEdit小部件。

問題1:如何從廣告位中返回值?

問題2:還是有什么辦法可以在NetworkFile類中獲取ui實例的副本,以便可以從那里使用小部件?

謝謝。

文檔開始

信號永遠不能具有返回類型(即使用void)。

因此,通過信號調用插槽返回類型是沒有用的(即使直接調用插槽(即,它是成員函數)時仍可以使用它們)。

話雖如此,您可以通過引用或插槽中的地址(即,如果是lambda)捕獲ui甚至更好的plainLineEdit ,並從那里正確設置字符串。

我只是將數據作為信號發出,並連接新信號和插槽之間的連接,然后在其中向您的用戶界面添加字符串。

一個快速的獨立示例(順便說一句,“由於代碼太長,我無法將其粘貼到這里。”只是一個借口,您幾乎總是可以減少相關代碼)

標題:

#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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM