PDA

View Full Version : Help with QTreeWidget list of contacts XMPP



SirJonas
14th October 2016, 17:43
Hi i am trying to do one project like webrtc but in small. In this chat i will have users connected and offline. I tried to do one easy example with QTreeWidget still i'm trying to solve this issue. My problem is when i add a new contact in my account, the contact old is deleted and the new is created. The problem is when i add the child.
Code:

logado = true; //contacts
ui->frameLogin->show();
ui->frameConexion->show();
int i,j;
QTreeWidgetItem *item = new QTreeWidgetItem();
QStringList contactos = cliente.rosterManager().getRosterBareJids();
for(i=0;i<contactos.length();i++)
{
item->setText(0,contactos[i]);
QStringList recursos = cliente.rosterManager().getResources(contactos[i]);
QIcon online;
online.addFile(":/icons/user-offline.png");
item->setIcon(0,online);
for(j=0;j<recursos.length();j++)
{
item->addChild(item);
item->child(j)->setText(0,recursos[j]);
online.addFile(":/icons/user-online.png");
item->setIcon(0,online);
item->child(j)->setIcon(0,online);


}
listaItems.append(item);
}
ui->arbolConectados->addTopLevelItems(listaItems);



Any idea is good. It's only in the child doesnt add me one child insted of create me a new child and delete me the old.

anda_skoa
14th October 2016, 21:56
Line 16 looks wrong, you are adding "item" to itself.

Cheers,
_

SirJonas
15th October 2016, 11:49
Ok i edited the code. The code was very wrong.
But i have one little question sorry again! But it's possible to add one item of my qtreewidget in my list??????

Actual code:

void MainWindow::rosterRecibido()
{
logado = true; //cuando recibimos el roster ya mostramos el frame con la lista de conectados
ui->frameLogin->hide();
ui->frameConexion->show();
int i,j;
QTreeWidgetItem *item = new QTreeWidgetItem();
QStringList contactos = cliente.rosterManager().getRosterBareJids();
QList<QString> listaItems;
for(i=0;i<contactos.length();i++)
{
item->setText(0,contactos[i]);
QStringList recursos = cliente.rosterManager().getResources(contactos[i]);
QIcon online;
online.addFile(":/icons/user-offline.png");
item->setIcon(0,online);
for(j=0;j<recursos.length();j++)
{
AddChild(item);
listaItems.append(item);
}
ui->arbolConectados->addTopLevelItems(listaItems);
}
}

void MainWindow::AddChild(QTreeWidgetItem *parent){
QTreeWidgetItem *item = new QTreeWidgetItem();
parent->addChild(item);

}

Added after 4 minutes:

I want in the before code to include items of my QTreeWidget in my list. And here resize the content that i will show.
And this code is when i show the content:

void MainWindow::cambioRoster(QString barejid, QString resource)
{
if(cliente.rosterManager().isRosterReceived() == true)
{
QIcon online;
online.addFile(":/icons/user-online.png");
if(ui->arbolConectados->findItems(barejid,Qt::MatchExactly).size() == 0)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0,barejid);
ui->arbolConectados->addTopLevelItem(item);
}
if(cliente.rosterManager().getPresence(barejid,res ource).type() == QXmppPresence::Available)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0,resource);
item->setIcon(0,online);
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->addChild(item);
}
if(cliente.rosterManager().getPresence(barejid,res ource).type() == QXmppPresence::Unavailable)
{
int i=0;
while(i<ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->childCount() && ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->child(i)->text(0) != resource) //busqueda lineal
{
i++;
}
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->takeChild(i);
if(ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->childCount() == 0)
{
online.addFile(":/icons/user-offline.png");
}
}
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->setIcon(0,online);
}
}

SirJonas
15th October 2016, 16:11
Basically my question is when i show my index rosterRecibido(), all time show me one item. I add my items to one list and show them. So i want to show more items. You can check code. I updated to add child but not get the thing that i am trying.

anda_skoa
15th October 2016, 16:48
Your code is very weird.

For example in rosterRecibido() you iterate over "contactos", yet you only ever use the same item.
The inner loop creates empty items for not apparent reason.

Your code in cambioRoster() does a lot of findItems() calls. Probably OK, but still very wastful.

Cheers,
_

davinciomare
15th October 2016, 18:06
message duplicated*

anda_skoa
15th October 2016, 18:10
Well, if you want to have separate items for each entry in contactos, then I suggest you do that.
Currently you are just setting new data on the single item you have.

The inner loop also makes no sense: if creates a number of children for "item" but again and again adds that very same "item" to a list.

Cheers,
_

SirJonas
15th October 2016, 18:40
i did so because the item heridate of father so will have the same features for example. In the cambioRoster() because i will three differents, Available, Unavailable and the first the size. But you are right i think i can show content of my qtreeview without repeat a lot of times the same thing.

This is the code:

void MainWindow::cambioRoster(QString barejid, QString resource)
{
if(cliente.rosterManager().isRosterReceived() == true)
{
QIcon online;
online.addFile(":/icons/user-online.png");
if(ui->arbolConectados->findItems(barejid,Qt::MatchExactly).size() == 0)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0,barejid);
ui->arbolConectados->addTopLevelItem(item);
}
if(cliente.rosterManager().getPresence(barejid,res ource).type() == QXmppPresence::Available)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0,resource);
item->setIcon(0,online);
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->addChild(item);
}
if(cliente.rosterManager().getPresence(barejid,res ource).type() == QXmppPresence::Unavailable)
{
int i=0;
while(i<ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->childCount() && ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->child(i)->text(0) != resource) //busqueda lineal
{
i++;
}
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->takeChild(i);
if(ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->childCount() == 0)
{
online.addFile(":/icons/user-offline.png");
}
}
ui->arbolConectados->findItems(barejid,Qt::MatchExactly)[0]->setIcon(0,online);
}
}

Added after 5 minutes:

for example when i try change the size of items finded show me this error:
https://i.imgsafe.org/13d50793d8.png

why skoda?

anda_skoa
16th October 2016, 07:28
for example when i try change the size of items finded show me this error:
https://i.imgsafe.org/13d50793d8.png

You are apparently accessing a QList with an index that is not valid for that list.

Cheers,
_