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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача посредством сигналов и слотов, из одного класса в компонент формы.  (Прочитано 4479 раз)
updaite
Гость
« : Сентябрь 02, 2014, 14:15 »

Здравствуйте, я не совсем понял из документации про сигналы и слоты, есть два класса A и B как мне из класса B при помощи (сигналов и слотов) занести текст в компонент textEdit класса A.
И как сделать наоборот забрать текст из textEdit из класса B?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Сентябрь 02, 2014, 14:40 »

1)
Код
C++ (Qt)
class A : ...
{
   QTextEdit *textEdit;
 
   void showB()
   {
       B *b = new B(this);
       connect(b, SIGNAL(sendText(QString)), textEdit, SLOT(setPlainText(QString)));
       b->show();
   }
};
 
class B : ...
{
   void someMethod()
   {
       emit sendText("my text");
   }
 
signals:
   void sendText(const QString &text);
};
2)
Код
C++ (Qt)
class A : ...
{
   void someMethod()
   {
       B *b = ... // получаешь указатель на существующий экземпляр класса каким-то образом
       QString textFromB = b->textEdit->toPlainText();
   }
};
 
class B : ...
{
public:
   QTextEdit *textEdit;
};
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #2 : Сентябрь 02, 2014, 15:19 »

Вот этот мой ответ тоже подходит Веселый http://www.prog.org.ru/index.php?topic=27529.msg200039#msg200039
Записан
updaite
Гость
« Ответ #3 : Сентябрь 02, 2014, 16:05 »

Не получилось, вообщем проще будет реализовать в одном классе (структура программы этого позволяет) но, класс B выглядит так.
Код:
class EchoServer : public QTcpServer 
а класс А так
Код:
class MainWindow : public QMainWindow
как мне совместить объекты класса B c A, можно ли как то указать наследника от : public QTcpServer как то по другому? Дабы если объединить классы ругает что 
Код:
public QTcpServer
отсутствует.
Записан
8Observer8
Гость
« Ответ #4 : Сентябрь 02, 2014, 16:18 »

Напрашивается такой вариант:
Код
C++ (Qt)
#include "EchoServer.h"
 
class MainWindow : public QMainWindow
{
   // ...
private:
   EchoServer *m_echoServer;
}
 
Записан
updaite
Гость
« Ответ #5 : Сентябрь 02, 2014, 16:35 »

Попробовал объединить запустилось без ошибок, но при запуске сервера приложение крошится.
mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include <QtNetwork>
#include <qtcpserver.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    Ui::MainWindow *ui;
    bool start();
    QList<QTcpSocket*> m_clients;
    QTcpServer *as;
private slots:
    void on_pushButton_2_clicked();
    void addConnection();
    void removeConnection();
    void onRead();
    void displayError(QAbstractSocket::SocketError);
    void on_pushButton_3_clicked();
private:

};
#endif // MAINWINDOW_H

mainwindow.ccp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QtCore>
#include <QtNetwork>
#include <qtcpserver.h>

#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())

using namespace std;

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

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

void MainWindow::on_pushButton_2_clicked()
{
  start();
  as = new QTcpServer(this);
}

bool MainWindow::start()
{
    QHostAddress addr;
    if (!as->listen(QHostAddress::Any, 5555))
    {
        //cout << STR(QObject::tr("Не могу запустить сервер: %1\n").arg( errorString() ) ); Вывести результат в textEdit
        close();
        return false;
    }
    connect(this, SIGNAL(newConnection()), this, SLOT(addConnection()));
   // cout << STR(QObject::tr("Сервер запущен\n"));
    return true;
}

void MainWindow::addConnection()
{
    QTcpSocket *client = as->nextPendingConnection();
    connect(client, SIGNAL(disconnected()),
            this, SLOT(removeConnection()));

    connect(client, SIGNAL(readyRead()), this,  SLOT(onRead()));

    connect(client, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
    QHostAddress addr = client->peerAddress();
   // cout << STR(QObject::tr("Подключился новый клиент с адреса %1\n").arg(addr.toString())); Вывести результат в textEdit
    m_clients.append(client);
}

void MainWindow::removeConnection()
{
    QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
    QHostAddress addr = client->peerAddress();
   // cout << STR(QObject::tr("Клиент %1 отключен\n").arg(addr.toString())); Вывести результат в textEdit
    m_clients.removeAt(m_clients.indexOf(client));
    client->deleteLater();
}

void MainWindow::onRead()
{
    QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
    QByteArray block = client->readAll();
    QString buffer = QTextCodec::codecForTr()->toUnicode(block.data());
    /*
    if ( s.contains(0x08) )
    {
        cout << STR(QObject::tr("\nСервер остановлен\n"));
        deleteLater();
        QCoreApplication::instance()->exit();
        return;
    }
    */
    QHostAddress addr = client->peerAddress();
   // cout << STR(QObject::tr("Получены новые данные от клиента %1: %2\n").arg( addr.toString() ).arg(buffer)); Вывести результат в textEdit
    client->write(QTextCodec::codecForLocale()->fromUnicode(buffer));
}

void MainWindow::displayError(QAbstractSocket::SocketError)
{
    //cout << STR(QObject::tr("\nОшибка: %1\n").arg(errorString())); Вывести результат в textEdit

}

void MainWindow::on_pushButton_3_clicked()
{
    while (!m_clients.isEmpty())
    {
        QTcpSocket *client = m_clients.takeFirst();
      //  client->write(QTextCodec::codecForLocale()->fromUnicode(QObject::tr("\nСервер отключается") + 0x0d )); Вывести результат в textEdit
        client->flush();
        client->close();
        client->deleteLater();
    }
}


Подскажите что опять не так я делаю?
Записан
8Observer8
Гость
« Ответ #6 : Сентябрь 02, 2014, 16:44 »

Потому что вы используете объект до его инициализации:
Код
C++ (Qt)
   start();
   as = new QTcpServer(this);
 
Записан
updaite
Гость
« Ответ #7 : Сентябрь 02, 2014, 16:46 »

Всем спасибо проблемы решены))
« Последнее редактирование: Сентябрь 02, 2014, 17:06 от updaite » Записан
8Observer8
Гость
« Ответ #8 : Сентябрь 02, 2014, 17:28 »

А вам большое спасибо, что научили выводить русский текст в консоль Улыбающийся

Код
C++ (Qt)
 
#include <iostream>
#include <QTextCodec>
#include <QObject>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   std::cout << STR(QObject::tr("Не могу запустить сервер") );
}
 

По поводу темы, то лучше читайте Шлее и разбирайте примеры отсюда: C:\Qt\Qt5.3.1\Examples\Qt-5.3\network
« Последнее редактирование: Сентябрь 02, 2014, 17:38 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #9 : Сентябрь 05, 2014, 12:51 »

А вам большое спасибо, что научили выводить русский текст в консоль Улыбающийся

Код
C++ (Qt)
 
#include <iostream>
#include <QTextCodec>
#include <QObject>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   std::cout << STR(QObject::tr("Не могу запустить сервер") );
}
 

По поводу темы, то лучше читайте Шлее и разбирайте примеры отсюда: C:\Qt\Qt5.3.1\Examples\Qt-5.3\network
Здесь говорят, что это не решение: http://www.prog.org.ru/index.php?topic=26545.msg200101#msg200101

updaite, я в качестве упражнения написал небольшой пример "Chat". Наверное, это самый минимальный пример "Клиент\Сервер" Улыбающийся

По локальной сети работает, а по глобальной - не проверял. Запускаете две копии программы и в одной из них нажимаете "Connect". Как на рисунках:




Исходники: https://github.com/8Observer8/Chat
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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