Domanda

QListWidgeTem contiene 2 dati: icona e testo. E voglio archiviare un altro Qstring. Come posso fare? Ecco il mio codice di test. L'elencowidget non visualizza nulla dopo aver chiamato additem.

E come posso sapere quale articolo viene cliccato? La funzione slot è "void on_listwidget_itemclicked (qlistwidgetiem* elemento)". Ovviamente l'elemento del parametro è la classe principale: QListWidgetItem, non la sottoclasse: 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);
}
È stato utile?

Soluzione

QListWidgetItem ha funzioni membri

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

e

QVariant QListWidgetItem::data ( int role ) const

per la memorizzazione di dati arbitrari (inclusi QString). Impostare role = Qt::UserRole (o qualsiasi valore più elevato).

Altri suggerimenti

Per muoversi su e giù nella gerarchia di classe puoi usare i cast, in questo caso Dynamic_cast:

dynamic_cast<QListWidgetItem*>( your_item )

Puoi usarlo come parametro per i tuoi segnali e slot. Questo dirà alla funzione di ricezione "Ehi, questo era un puntatore su un QlistWidgetItem, quindi trattalo così!"

E per visualizzare ulteriori informazioni è necessario considerare di utilizzare QtableWidget. Penso che ciò soddisferebbe le tue esigenze e non dovresti andare a quella deviazione sopra le informazioni di "contrabbando" come hai fatto tu ;-)

Modificare:

Come risposta al tuo commento:

Dai un'occhiata a QtableWidgetItem. Vedrai che anche un QtableWidgetItem può avere un'icona :-) Quindi quello che devi fare è dividere le tue informazioni in diversi QtableWidgetItems. Hai un elemento per l'icona, acceso per il testo e un altro per un altro testo e ciò di cui hai bisogno.

Ora ogni riga è quello che avevi prima come elemento in un ListWidget. Ora non appena l'utente fa clic da qualche parte, si utilizza il segnale cellClicked( int row, int column ) e row Ti dice quale riga è stata cliccata. Ora hai la riga che è stata cliccata e puoi ottenere le informazioni che stai cercando.

Supponiamo che l'utente abbia fatto clic sulla quarta riga. Ogni riga ha colonne. La prima colonna contiene l'icona, la seconda colonna contiene il nome. E ora la cosa speciale: la terza colonna contiene l'IP, ma è nascosto. Puoi farlo, usando hideColumn( int column ).

Riga 4: [Colonna 0: icona | Colonna 1: nome | Colonna 2: (nascosto) IP

Quindi ogni volta che l'utente fa clic su una riga, si cerca semplicemente l'IP nella colonna numero 2.

Naturalmente puoi aggiungere tutte le celle che vuoi ... una contenente la stringa con il nome, un'altra con una descrizione ... e diciamo solo, l'ultima colonna è la tua colonna nascosta con l'IP.

Puoi anche rendere invisibile la griglia utilizzando setShowGrid( false ). Ora sembra una normale visualizzazione di informazioni, in cui ogni riga è un elemento.

:-)

EDIT 2:

Per mostrarti cosa voglio dire ho implementato un piccolo esempio. Vedi il codice qui sotto.

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)) );

Ora abbiamo un tavolo senza griglia con intestazioni orizzontali (di cui non hai bisogno ovviamente). Quando si fa clic su una riga, l'intera riga viene selezionata e viene chiamata la seguente slot:

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();
}

Questo è solo un semplice esempio che ho scritto rapidamente ... Ci sono modi migliori per farlo ovviamente, ma forse aiuta a risolvere il tuo problema.

Example implementation in sandbox app

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top