Russian Qt Forum
Март 28, 2024, 18:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с ui в другом классе  (Прочитано 3194 раз)
justengineer
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« : Апрель 02, 2020, 19:21 »

Всем здравствуйте!

Пишу клиент-серверное приложение (TCP\IP).
Проект - приложение Qt Widgets.
Для работы с сервером был создан отдельный класс Myserver : public QTcpServer.
Но возникла трудность: при приеме сервером сообщения от клиента мне нужно это сообщение обработать определенным образом и вывести, например, в lineEdit. Не понимаю, как из класса Myserver подступиться к моему ui, который в MainWindow.

Попыткой решения было создание on_dataInTextEdit() в MainWindow и последующий вызов его в Myserver в sockReady(), но не работает. Причем qDebug прописывает строку, а вот lineEdit так и остается пустым.

Кусочки кода для наглядности:

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "myserver.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    Ui::MainWindow *ui;

public slots:
    void on_dataInTextEdit();

private slots:
    void on_pushButton_start_clicked();

    void on_pushButton_stop_clicked();

private:
    Myserver server;
    Myserver server1;
};

#endif // MAINWINDOW_H


myserver.h
Код:
#ifndef MYSERVER_H
#define MYSERVER_H

#include <QTcpServer>
#include <QTcpSocket>

class Myserver : public QTcpServer
{
    Q_OBJECT
public:
    Myserver ();

    QTcpSocket *socket;
    QByteArray data;

public slots:
    void incomingConnection(qintptr socketDescriptor);
    void sockReady();
    void sockDisc();
};

#endif // MYSERVER_H


mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

.......

void MainWindow::on_dataInTextEdit()
{
    ui->lineEdit->setText("text");
    qDebug()<<"on_dataInTextEdit";
}


myserver.cpp
Код:
#include "myserver.h"
#include "ui_mainwindow.h"
#include "mainwindow.h"

Myserver::Myserver()
{
}

void Myserver::incomingConnection(qintptr socketDescriptor)
{
    socket = new QTcpSocket(this);
    socket->setSocketDescriptor(socketDescriptor);
    connect(socket,SIGNAL(readyRead()),this,SLOT(sockReady()));
}

.......

void Myserver::sockReady()
{
    qDebug()<<"Socket is ready";
    data = socket->readAll();
    qDebug()<<"Data: "<<data<<"from"<<serverPort();
    MainWindow *mw = new MainWindow();
    mw->on_dataInTextEdit();
}

Если кто-нибудь знает, что не так, помогите, пожалуйста.
Спасибо.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Апрель 02, 2020, 20:27 »

Для работы с сервером был создан отдельный класс Myserver : public QTcpServer.

и зачем наследоваться так ?
делай Myserver* QTcpServer полем MainWindow подписывайся на события и обрабатывай
смотри пример https://doc.qt.io/qt-5/qtnetwork-fortuneserver-example.html
Записан
justengineer
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« Ответ #2 : Апрель 03, 2020, 14:19 »

К сожалению, сделать все в разных классах - это одно из условий поставленной задачи...
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #3 : Апрель 03, 2020, 15:06 »

тебе следует еще много изучить: "MainWindow *mw = new MainWindow();" в обработчике приема данных это лютый пиздец
Записан
justengineer
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« Ответ #4 : Апрель 04, 2020, 16:21 »

Да, соглашусь с Вами. Ну, просто как вариант был...
Может, попробую сигнал-слот.
Стыдно, но так не люблю теорию читать... Но без этого никак, конечно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 22.