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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Model/View: как лучше работать с списком QTcpSocket в классе модели?  (Прочитано 4250 раз)
asterix39rus
Гость
« : Март 27, 2012, 00:01 »

Всем доброго времени суток!

Имеется модель:

Код
C++ (Qt)
class CGeneralList : public QAbstractTableModel
{
   Q_OBJECT
...................
   QList<CClientRow*> *ListForTest;
}
имеется сторонний класс:
Код
C++ (Qt)
class CServer : QObject
в котором есть обработчики сокетов:
Код
C++ (Qt)
void CServer::sNewConnection()
{
   QTcpSocket* clientSocket = tcpDaemon->nextPendingConnection();
   int sockDescroptor = clientSocket->socketDescriptor();
 
   CClientRow *client = new CClientRow(clientSocket);
   client->SetDescription(sockDescroptor);
 
   theManager->addRow(client);
   connect(clientSocket,SIGNAL(readyRead()),this, SLOT(sReadClient()));
}

и
Код
C++ (Qt)
void CServer::sReadClient()
{
    QTcpSocket* clientSocket = (QTcpSocket*)sender();
    int idusersocs=clientSocket->socketDescriptor();
}

И вот в чём вопрос, в sNewConnection() я создаю запись в модели (кидаю в неё Descriptor), а вот как мне теперь лучше обновить запись в модели в sReadClient()?
По сути единственная привязка - Descriptor сокета в sReadClient(), получается нужно по Descriptor выбрать определённую запись в модели и вернуть нужный экземпляр QTcpSocket*?

Правильно ли это? Можно как-то упростить? Кто-то уже решал подобные задачи?
Записан
mutineer
Гость
« Ответ #1 : Март 27, 2012, 00:10 »

а чем тебя этот сокет не устраивает?
Код:
QTcpSocket* clientSocket = (QTcpSocket*)sender();

Почему тут client сам не может из сокета дескриптор получить, зачем его снаружи задавать?
Код:
    CClientRow *client = new CClientRow(clientSocket);
    client->SetDescription(sockDescroptor);
Записан
asterix39rus
Гость
« Ответ #2 : Март 27, 2012, 00:20 »

а чем тебя этот сокет не устраивает?
Да в принципе устраивает, просто не хочется дёргать модель и перебирать в ней список объектов.
Хочется работать в sReadClient c QTcpSocket*, который создал на этапе соединения. Получается, что помимо набора указателей на сокеты, придётся хранить ещё один набор в CServer, но опять придётся его перебирать, чтобы получить нужный указатель на клиент по descriptor....

Почему тут client сам не может из сокета дескриптор получить, зачем его снаружи задавать?
Код:
    CClientRow *client = new CClientRow(clientSocket);
    client->SetDescription(sockDescroptor);
Не идёт, т.к. тут создаётся новый объект, а нужно обращаться к существующему в модели.
Записан
mutineer
Гость
« Ответ #3 : Март 27, 2012, 10:02 »

Код:
QTcpSocket* clientSocket = (QTcpSocket*)sender();
1) не используй такое приведение, юзай qobject_cast или dynamic_cast
2) ты получаешь тут тот сокет, который отправил сигнал. А это как раз тот сокет, который создался на этапе соединения. Зачем еще в модель лезть?


Цитировать
Не идёт, т.к. тут создаётся новый объект, а нужно обращаться к существующему в модели.
какой еще новый объект? зачем нужна вот эта строка?
Код:
client->SetDescription(sockDescroptor);
если client может сам дескриптор получить из переданного ему строчкой выше сокета
Записан
asterix39rus
Гость
« Ответ #4 : Март 27, 2012, 10:06 »

Цитировать
2) ты получаешь тут тот сокет, который отправил сигнал. А это как раз тот сокет, который создался на этапе соединения
Да, теперь понял, connect вешаю на конкретный указатель сокета, поэтому можно сразу его менять и не лезть в модель.

Цитировать
1) не используй такое приведение, юзай qobject_cast или dynamic_cast
Учту. А какие подводные камни я обхожу в этом случае?
Записан
mutineer
Гость
« Ответ #5 : Март 27, 2012, 10:14 »

Цитировать
1) не используй такое приведение, юзай qobject_cast или dynamic_cast
Учту. А какие подводные камни я обхожу в этом случае?

Если sender() вернет тебе не QTcpSocket*, а указатель на объект другого типа (а он может), то qobject_cast и dynamic_cast это поймут и вернут 0. А (QTcpSocket*) просто прикастует указатель к нужному типу без оглядки на то, можно ли так делать. И ты будешь работать с непонятной областью памяти как с сокетом
Записан
asterix39rus
Гость
« Ответ #6 : Март 27, 2012, 11:34 »

Спасибо за помощь, тему можно закрывать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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