Для перемещения вверх и вниз по иерархии классов вы можете использовать приведение, в данном случае dynamic_cast:
dynamic_cast<QListWidgetItem*>( your_item )
Вы можете использовать это в качестве параметра для ваших сигналов и слотов. Это скажет получающей функции: «Эй, раньше это был указатель на QListWidgetItem, поэтому относитесь к нему так!»
И для отображения дополнительной информации вы должны рассмотреть возможность использования QTableWidget. Я думаю, что это будет соответствовать вашим требованиям, и вам не придется идти в обход «контрабанды» информации, как вы сделали; -)
Edit:
В ответ на ваш комментарий:
Посмотрите на QTableWidgetItem . Вы увидите, что у QTableWidgetItem тоже может быть значок :-) Итак, вам нужно разделить вашу информацию на несколько QTableWidgetItems. У вас есть элемент для значка, для текста и еще один для другого текста и того, что вам нужно.
Теперь каждая строка - это то, что вы имели раньше как один элемент в ListWidget. Теперь, когда пользователь щелкает где-то, вы используете сигнал cellClicked( int row, int column )
, а row
сообщает вам, какая строка была нажата. Теперь у вас есть строка, по которой щелкнули, и вы можете получить искомую информацию.
Допустим, пользователь щелкнул 4-й ряд. В каждой строке есть столбцы. Первый столбец содержит значок, второй столбец содержит имя. А теперь особенность: третий столбец содержит IP-адрес, но скрыт 1025 *. Вы можете сделать это, используя hideColumn( int column )
.
Строка 4: [Колонка 0: Значок | Колонка 1: Имя | Колонка 2: (скрытый) IP]
Таким образом, каждый раз, когда пользователь щелкает строку, вы просто просматриваете IP-адрес в столбце № 2.
Конечно, вы можете добавить столько ячеек, сколько захотите ... Одна содержит строку с именем, другая - с описанием ... И, скажем так, последний столбец - это ваш скрытый столбец с IP.
Вы также можете сделать сетку невидимой, используя setShowGrid( false )
. Теперь это выглядит как обычное отображение информации, где каждая строка представляет собой один элемент.
: -)
Редактировать 2:
Чтобы показать вам, что я имею в виду, я реализовал небольшой пример. Смотрите код ниже.
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)) );
Теперь у нас есть таблица без сетки с горизонтальными заголовками (которая вам, разумеется, не нужна). При нажатии на строку выделяется вся строка и вызывается следующий слот:
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();
}
Это простой пример, который я быстро написал ... Конечно, есть лучшие способы сделать это, но, возможно, это поможет решить вашу проблему.