2011-05-03 13 views
5

El QListWidgetItem contiene 2 datos: icono y texto. Y quiero almacenar otro QString en él. ¿Como lo puedo hacer? Aquí está mi código de prueba. El ListWidget no muestra nada después de llamar a addItem.Personaliza QListWidgetItem con datos adicionales para almacenar, ¿Cómo?

Y cómo puedo saber qué elemento se hace clic? La función SLOT es "void on_listWidget_itemClicked (elemento QListWidgetItem *)". Obviamente, el elemento parámetro es la clase padre: QListWidgetItem, NO la subclase: ListWidgetItem

ListWidgetItem::ListWidgetItem(const QIcon &icon, const QString &text,QString &ip, QListWidget *parent, int type) 
{ 
    myip = ip; 
    QListWidgetItem::QListWidgetItem(icon,text,parent,type); 
} 

ListWidgetItem::~ListWidgetItem() 
{ 

} 

QVariant ListWidgetItem::data(int role) const 
{ 
    if (role==IPROLE) 
    { 
     return myip; 
    } 
    return QListWidgetItem::data(role); 
} 

void ListWidgetItem::setData(int role, const QVariant &value) 
{ 
    if (role==IPROLE) 
    { 
     myip = value.toString(); 
    } 
    QListWidgetItem::setData(role,value); 
} 

Respuesta

7

QListWidgetItem tiene funciones miembro

void QListWidgetItem::setData (int role, const QVariant & value) 

y

QVariant QListWidgetItem::data (int role) const 

para almacenar datos arbitrarios (incluyendo QString). Establezca role = Qt::UserRole (o cualquier valor superior).

6

para mover hacia arriba y hacia abajo en la jerarquía de clases puede utilizar moldes, en este caso dynamic_cast:

dynamic_cast<QListWidgetItem*>(your_item) 

Usted puede usar esto como su parámetro para sus señales y ranuras. Esto le dirá a la función de recepción "¡Oye, esto solía ser un puntero en un QListWidgetItem, así que trátalo así!"

Y para mostrar más información usted debe considerar el uso de QTableWidget lugar. Creo que se ajuste a sus necesidades y que no tendría que ir a ese desvío sobre la información "contrabando" como lo hizo ;-)

Editar:

Como respuesta a su comentario:

Eche un vistazo al QTableWidgetItem. Verá que un QTableWidgetItem también puede tener un ícono :-) Entonces, lo que necesita hacer es dividir su información en varios QTableWidgetItems. Tiene un elemento para el icono, el texto y otro para otro texto y lo que necesita.

Ahora cada fila es lo que tenía antes como un elemento en un ListWidget. Ahora, tan pronto como el usuario haga clic en algún lugar, use la señal cellClicked(int row, int column) y row le indica en qué fila se ha hecho clic. Ahora tiene la fila en la que se ha hecho clic y puede obtener la información que está buscando.

permite decir que el usuario hace clic en la cuarta fila. Cada fila tiene columnas. La primera columna contiene el icono, la segunda columna contiene el nombre. Y ahora lo especial: la tercera columna contiene el IP, pero es oculto. Puede hacerlo, usando hideColumn(int column).

Fila 4: [0 Columna: Icono | Columna 1: Nombre | Columna 2: (oculto) IP]

Así que cada vez que el usuario hace clic en una fila, que acaba de ver la IP en el número de columna 2.

Por supuesto puede agregar tanto las células como quiera ... Uno que contiene la cadena con el nombre, otra con una descripción ... Y digamos que la última columna es tu columna oculta con la IP.

También puede hacer que la cuadrícula invisible mediante el uso de setShowGrid(false). Ahora parece una visualización normal de información, donde cada fila es un elemento.

:-)

Edición 2:

Para mostrar lo que quiero decir que he implementado un pequeño ejemplo. Vea el código a continuación.

m_table_widget = new QTableWidget(4, 4, this); 

QTableWidgetItem* my_item_0 = new QTableWidgetItem("icon 1"); 
QTableWidgetItem* my_item_1 = new QTableWidgetItem("server 1"); 
QTableWidgetItem* my_item_2 = new QTableWidgetItem("this is server 1"); 
QTableWidgetItem* my_item_3 = new QTableWidgetItem("192.0.0.1"); 

QTableWidgetItem* my_item_4 = new QTableWidgetItem("icon 2"); 
QTableWidgetItem* my_item_5 = new QTableWidgetItem("server 2"); 
QTableWidgetItem* my_item_6 = new QTableWidgetItem("this is server 2"); 
QTableWidgetItem* my_item_7 = new QTableWidgetItem("192.0.0.2"); 

m_table_widget->setItem(0, 0, my_item_0); 
m_table_widget->setItem(0, 1, my_item_1); 
m_table_widget->setItem(0, 2, my_item_2); 
m_table_widget->setItem(0, 3, my_item_3); 

m_table_widget->setItem(1, 0, my_item_4); 
m_table_widget->setItem(1, 1, my_item_5); 
m_table_widget->setItem(1, 2, my_item_6); 
m_table_widget->setItem(1, 3, my_item_7); 

m_table_widget->hideColumn(3); 
m_table_widget->setShowGrid(false); 
m_table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); 
m_table_widget->verticalHeader()->hide(); 

QStringList list; 
list << "Icon" << "Name" << "Description" << "IP"; 
m_table_widget->setHorizontalHeaderLabels(list); 

connect(m_table_widget, SIGNAL(cellClicked(int,int)), this, SLOT(on_cell_clicked(int,int))); 

Ahora tenemos una tabla sin cuadrícula con encabezados horizontales (que no necesita, por supuesto). Al hacer clic en una fila, se selecciona toda la fila y la siguiente ranura se llama:

void main_window::on_cell_clicked(int row, int column) 
{ 
    QString ip = m_table_widget->item(row, 3)->text(); 
    QMessageBox message(QMessageBox::Information, "Server Info", QString("This is row %1 and the IP is: %2").arg(row).arg(ip)); 

    message.exec(); 
} 

Esto es sólo un ejemplo sencillo rápidamente escribí ... Hay mejores maneras de hacer esto, por supuesto, pero tal vez ayuda a resolver su problema

Example implementation in sandbox app

+0

Gracias. Pero QTableWidget no es compatible con IconMode. Quiero mostrar íconos con los nombres a continuación; al hacer clic en ellos, la aplicación puede obtener la información del ítem, en mi caso, IP. – catinred

+0

Ver mi publicación editada :) – Exa

+0

Otra edición con código de ejemplo e imagen. – Exa

Cuestiones relacionadas