cat*_*red 5 customization qt qlistwidget
QListWidgetItem包含2个数据:图标和文本.我想在其中存储另一个QString.我能怎么做?这是我的测试代码.在调用addItem之后,ListWidget不显示任何内容.
我怎么知道点击了哪个项目?SLOT函数是"void on_listWidget_itemClicked(QListWidgetItem*item)".显然,参数项是父类:QListWidgetItem,而不是子类: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);
}
Run Code Online (Sandbox Code Playgroud)
QListWidgetItem 有会员功能
void QListWidgetItem::setData ( int role, const QVariant & value )
Run Code Online (Sandbox Code Playgroud)
和
QVariant QListWidgetItem::data ( int role ) const
Run Code Online (Sandbox Code Playgroud)
用于存储任意数据(包括QString).设置role = Qt::UserRole(或任何更高的值).
要在类层次结构中上下移动,可以使用强制转换,在本例中为dynamic_cast:
dynamic_cast<QListWidgetItem*>( your_item )
Run Code Online (Sandbox Code Playgroud)
您可以将其用作信号和插槽的参数.这将告诉接收函数"嘿,这曾经是QListWidgetItem上的指针,所以对待就好了!"
为了显示更多信息,您应该考虑使用QTableWidget.我认为这符合您的要求,您不必像往常一样绕过"走私"信息;-)
编辑:
作为对您评论的回复:
看看QTableWidgetItem.你会看到,QTableWidgetItem也可以有一个图标:-)所以你需要做的是,将你的信息分成几个QTableWidgetItems.你有一个图标的项目,文本的项目,另一个文本和你需要的项目.
现在,每行都是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)) );
Run Code Online (Sandbox Code Playgroud)
现在我们有一个没有水平标题网格的表格(当然你不需要).单击某行时,将选择整行并调用以下插槽:
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();
}
Run Code Online (Sandbox Code Playgroud)
这只是我快速写的一个简单例子......当然有更好的方法可以做到这一点,但也许它有助于解决您的问题.
