Russian Qt Forum

Qt => Вопросы новичков => Тема начата: updaite от Сентябрь 02, 2014, 14:15



Название: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: updaite от Сентябрь 02, 2014, 14:15
Здравствуйте, я не совсем понял из документации про сигналы и слоты, есть два класса A и B как мне из класса B при помощи (сигналов и слотов) занести текст в компонент textEdit класса A.
И как сделать наоборот забрать текст из textEdit из класса B?


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: kambala от Сентябрь 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;
};


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 8Observer8 от Сентябрь 02, 2014, 15:19
Вот этот мой ответ тоже подходит :D http://www.prog.org.ru/index.php?topic=27529.msg200039#msg200039


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: updaite от Сентябрь 02, 2014, 16:05
Не получилось, вообщем проще будет реализовать в одном классе (структура программы этого позволяет) но, класс B выглядит так.
Код:
class EchoServer : public QTcpServer 
а класс А так
Код:
class MainWindow : public QMainWindow
как мне совместить объекты класса B c A, можно ли как то указать наследника от : public QTcpServer как то по другому? Дабы если объединить классы ругает что 
Код:
public QTcpServer
отсутствует.


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 8Observer8 от Сентябрь 02, 2014, 16:18
Напрашивается такой вариант:
Код
C++ (Qt)
#include "EchoServer.h"
 
class MainWindow : public QMainWindow
{
   // ...
private:
   EchoServer *m_echoServer;
}
 


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: updaite от Сентябрь 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();
    }
}


Подскажите что опять не так я делаю?


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 8Observer8 от Сентябрь 02, 2014, 16:44
Потому что вы используете объект до его инициализации:
Код
C++ (Qt)
   start();
   as = new QTcpServer(this);
 


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: updaite от Сентябрь 02, 2014, 16:46
Всем спасибо проблемы решены))


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 8Observer8 от Сентябрь 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


Название: Re: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 8Observer8 от Сентябрь 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". Как на рисунках:
(http://i.pixs.ru/storage/1/0/2/327png_3676039_13711102.png)

(http://i7.pixs.ru/storage/1/2/9/328png_9342086_13711129.png)

Исходники: https://github.com/8Observer8/Chat