Передача сигналов и данных из одного класса в другой на Qt

Сначала я опубликую код, так как после этого его будет легче понять.

По сути, у меня есть класс по умолчанию, MainWindow:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

#include "tcpsocket.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

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

private:
Ui::MainWindow *ui;

//This is my class
tcpsocket *socket;

public slots:
void updateUI(QString);

private slots:
void on_connectButton_clicked();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::updateUI(QString msg)
{
qDebug() << "GOOD, SLOT ACCESSED FROM ANOTHER CLASS";
ui->responseBox->setText(msg);
}

void MainWindow::on_connectButton_clicked()
{
socket = new tcpsocket();
socket->doConnect();
}

Позади это простая форма с нажать кнопку и текстовое окно.

И второй класс:

tcpsocket.h

#ifndef TCPSOCKET_H
#define TCPSOCKET_H

#include <QMainWindow>
#include <QObject>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QBitArray>
#include <QDebug>

#include "mainwindow.h"
class tcpsocket : public QMainWindow
{
Q_OBJECT
public:

explicit tcpsocket(QWidget *parent = 0);
void doConnect();

signals:

public slots:
void connected();
void disconnected();
void bytesWritten(qint64 bytes);
void readyRead();

private:
QTcpSocket *socket;
};

#endif // TCPSOCKET_H

а также tcpsocket.cpp

#include "tcpsocket.h"
tcpsocket::tcpsocket(QWidget *parent) : QMainWindow(parent)
{

}

void tcpsocket::doConnect()
{
socket = new QTcpSocket(this);

connect(socket, SIGNAL(connected()),this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));

//And here I want to add a signal to a slor from main window.
//Something like this:
// connect(socket, SIGNAL(readyRead()), MainWindow, SLOT(updateUI());

qDebug() << "connecting...";

// this is not blocking call
socket->connectToHost("google.com", 80);

// we need to wait...
if(!socket->waitForConnected(5000))
{
qDebug() << "Error: " << socket->errorString();
}
}

void tcpsocket::connected()
{
qDebug() << "connected...";

// Hey server, tell me about you.
socket->write("HEAD / HTTP/1.0\r\n\r\n\r\n\r\n");
}

void tcpsocket::disconnected()
{
qDebug() << "disconnected...";
}

void tcpsocket::bytesWritten(qint64 bytes)
{
qDebug() << bytes << " bytes written...";
}

void tcpsocket::readyRead()
{
qDebug() << "reading response...";
QString data = socket->readAll();
qDebug() << data;

//Here, I want to pass somehow this content to function updateUI, from MainWindow
// MainWindow::updateUI( data );

}

В общем, я хочу передать некоторые данные из класс tcpsocket в учебный класс MainWindow

main.cpp это код по умолчанию. Я думаю, что это не актуально.

Чтобы быть более конкретным, я хочу, чтобы сигнал от класс tcpsocket вызвать слот из Класс MainWindow:

void tcpsocket::doConnect()
{
socket = new QTcpSocket(this);

//local slots
connect(socket, SIGNAL(connected()),this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));

//And here I want to add a signal to a slot from main window.
//Something like this:
// connect(socket, SIGNAL(readyRead()), MainWindow, SLOT(updateUI());

....

И второй вопрос, как передать некоторые данные из класс tcpsocket в Класс MainWindow:

void tcpsocket::readyRead()
{
qDebug() << "reading response...";
QString data = socket->readAll();
qDebug() << data;

//Here, I want to pass somehow this content to function updateUI, from MainWindow
// MainWindow::updateUI( data );

}

Приложение работает отлично, и контент извлекается. Но я могу просматривать извлеченный контент только с помощью qDebug (); поэтому я хочу передать ответ в GUI, в textBox.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]