为了在类层次结构中上下移动,您可以使用强制转换,在本例中为 dynamic_cast:
dynamic_cast<QListWidgetItem*>( your_item )
您可以将其用作信号和插槽的参数。这将告诉接收函数“嘿,这曾经是一个 QListWidgetItem 上的指针,所以这样对待它!”
为了显示更多信息,您应该考虑改用 QTableWidget。我认为这符合您的要求,您不必像以前那样绕道“走私”信息;-)
编辑:
作为对您评论的回应:
看看QTableWidgetItem。你会看到,一个 QTableWidgetItem 也可以有一个图标 :-) 所以你需要做的就是把你的信息分成几个 QTableWidgetItem。您有一个用于图标的项目,一个用于文本的项目,另一个用于另一个文本和您需要的内容。
现在每一行都是你以前在 ListWidget 中的一个项目。现在,只要用户单击某处,您就会使用信号cellClicked( int row, int column )
并row
告诉您单击了哪一行。现在您有了已单击的行,并且可以获取您要查找的信息。
假设用户点击了第 4 行。每行都有列。第一列包含图标,第二列包含名称。现在特别之处:第三列包含 IP,但是是隐藏的。你可以这样做,通过使用hideColumn( int column )
.
第 4 行:[ 第 0 列:图标 | 第 1 列:名称 | 第 2 列:(隐藏)IP]
因此,每次用户单击一行时,您只需在第 2 列中查找 IP。
当然,您可以根据需要添加任意数量的单元格...一个包含带有名称的字符串,另一个包含描述...我们只是说,最后一列是您的隐藏列,其中包含 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();
}
这只是我快速编写的一个简单示例......当然有更好的方法可以做到这一点,但也许它有助于解决您的问题。
