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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по Архитектуре  (Прочитано 2141 раз)
linkr
Гость
« : Июнь 08, 2010, 21:32 »

собственно есть QMainWindow,QTCPServer,QThread

клиентские запросы выполняются в QThread , но чтобы показать, что к примеру произошло соединение приходиться добираться до QMainWindow, в котором лежит интерфейс, через QTCPServer, при помощи построения своих сигналов и слотов. Собственно как лучше организовать работу? какой паттерн подойдет?

приложение похоже по архитектуре на example:threadfortuneserver
« Последнее редактирование: Июнь 08, 2010, 23:00 от linkr » Записан
ритт
Гость
« Ответ #1 : Июнь 08, 2010, 23:29 »

ничего не понял...
Записан
linkr
Гость
« Ответ #2 : Июнь 09, 2010, 00:05 »

ничего не понял...

Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:

     MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void message(QString mess);
private:
    void createServer();

    QTextBrowser* TextBrowser;
    Server* server;
};

Код:
class Server : public QTcpServer
{
    Q_OBJECT

public:
    Server(QObject *parent = 0);
signals:
    void messageTo(QString mess);
private slots:
   void message(QString mess);
protected:
    void incomingConnection(int socketDescriptor);
};

Код:
class FortuneThread : public QThread
{
    Q_OBJECT

public:
    FortuneThread(int socketDescriptor, const QString &server, QObject *parent);

    void run();

signals:
    void error(QTcpSocket::SocketError socketError);
    void messageTo(QString mess);

private:
    int socketDescriptor;
    QString text;
};

что бы догнать месседж от  FortuneThread до MainWindow приходится 2 раза делать connect в Server  и в  MainWindow

    QObject::connect(thread,SIGNAL(messageTo(QString)),this,SLOT(message(QString)));//this - server

    QObject::connect(server,SIGNAL(messageTo(QString)),this,SLOT(message(QString)));//this - MainWindow

гнать сигнал вот так

void Server::message(QString mess)
{
    qDebug(mess.toAscii());
    emit  messageTo(mess);
}

после получения в MainWindow выводим TextBrowser
мне кажется глупо просто так делать,а как по другому не знаю,вопрос скорее теоретический,как  лучше реализовать передачу объекта через  лишний класс?

хотя вот так клево все)
QObject::connect(thread,SIGNAL(messageTo(QString)),this,SIGNAL(messageTo(QString)));

все вопрос решен)
передано напрямую
QObject::connect(thread,SIGNAL(messageTo(QString)),this->parent(),SLOT(message(QString)));



« Последнее редактирование: Июнь 09, 2010, 01:18 от linkr » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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