Russian Qt Forum

Qt => Model-View (MV) => Тема начата: asterix39rus от Март 27, 2012, 00:01



Название: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: 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*?

Правильно ли это? Можно как-то упростить? Кто-то уже решал подобные задачи?


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: mutineer от Март 27, 2012, 00:10
а чем тебя этот сокет не устраивает?
Код:
QTcpSocket* clientSocket = (QTcpSocket*)sender();

Почему тут client сам не может из сокета дескриптор получить, зачем его снаружи задавать?
Код:
    CClientRow *client = new CClientRow(clientSocket);
    client->SetDescription(sockDescroptor);


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: asterix39rus от Март 27, 2012, 00:20
а чем тебя этот сокет не устраивает?
Да в принципе устраивает, просто не хочется дёргать модель и перебирать в ней список объектов.
Хочется работать в sReadClient c QTcpSocket*, который создал на этапе соединения. Получается, что помимо набора указателей на сокеты, придётся хранить ещё один набор в CServer, но опять придётся его перебирать, чтобы получить нужный указатель на клиент по descriptor....

Почему тут client сам не может из сокета дескриптор получить, зачем его снаружи задавать?
Код:
    CClientRow *client = new CClientRow(clientSocket);
    client->SetDescription(sockDescroptor);
Не идёт, т.к. тут создаётся новый объект, а нужно обращаться к существующему в модели.


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе
Отправлено: mutineer от Март 27, 2012, 10:02
Код:
QTcpSocket* clientSocket = (QTcpSocket*)sender();
1) не используй такое приведение, юзай qobject_cast или dynamic_cast
2) ты получаешь тут тот сокет, который отправил сигнал. А это как раз тот сокет, который создался на этапе соединения. Зачем еще в модель лезть?


Цитировать
Не идёт, т.к. тут создаётся новый объект, а нужно обращаться к существующему в модели.
какой еще новый объект? зачем нужна вот эта строка?
Код:
client->SetDescription(sockDescroptor);
если client может сам дескриптор получить из переданного ему строчкой выше сокета


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: asterix39rus от Март 27, 2012, 10:06
Цитировать
2) ты получаешь тут тот сокет, который отправил сигнал. А это как раз тот сокет, который создался на этапе соединения
Да, теперь понял, connect вешаю на конкретный указатель сокета, поэтому можно сразу его менять и не лезть в модель.

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


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: mutineer от Март 27, 2012, 10:14
Цитировать
1) не используй такое приведение, юзай qobject_cast или dynamic_cast
Учту. А какие подводные камни я обхожу в этом случае?

Если sender() вернет тебе не QTcpSocket*, а указатель на объект другого типа (а он может), то qobject_cast и dynamic_cast это поймут и вернут 0. А (QTcpSocket*) просто прикастует указатель к нужному типу без оглядки на то, можно ли так делать. И ты будешь работать с непонятной областью памяти как с сокетом


Название: Re: Model/View: как лучше работать с списком QTcpSocket в классе модели?
Отправлено: asterix39rus от Март 27, 2012, 11:34
Спасибо за помощь, тему можно закрывать