Название: Передача посредством сигналов и слотов, из одного класса в компонент формы.
Отправлено: 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 как то по другому? Дабы если объединить классы ругает что отсутствует.
Название: 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
|