【问题标题】:Customize QListWidgetItem with extra data to store in, How?使用要存储的额外数据自定义 QListWidgetItem,如何?
【发布时间】:2011-05-03 10:49:38
【问题描述】:

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

【问题讨论】:

    标签: qt customization qlistwidget


    【解决方案1】:

    QListWidgetItem 有成员函数

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

    QVariant QListWidgetItem::data ( int role ) const
    

    用于存储任意数据(包括QString)。设置role = Qt::UserRole(或任何更高的值)。

    【讨论】:

      【解决方案2】:

      为了在类层次结构中上下移动,您可以使用强制转换,在本例中为 dynamic_cast:

      dynamic_cast<QListWidgetItem*>( your_item )
      

      您可以将其用作信号和插槽的参数。这将告诉接收函数“嘿,这曾经是一个 QListWidgetItem 上的指针,所以这样对待它!”

      为了显示更多信息,您应该考虑改用 QTableWidget。我认为这符合您的要求,您不必像以前那样在“走私”信息上绕道;-)

      编辑:

      作为对您评论的回应:

      看看QTableWidgetItem。你会看到,一个 QTableWidgetItem 也可以有一个图标 :-) 所以你需要做的是将你的信息分成几个 QTableWidgetItem。您有一个项目作为图标,on 用于文本,另一个项目用于另一个文本和您需要的内容。

      现在每个 都是您之前在 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();
      }
      

      这只是我快速编写的一个简单示例...当然有更好的方法,但也许它有助于解决您的问题。

      【讨论】:

      • 谢谢。但是 QTableWidget 不支持 IconMode。我想在下面显示带有名称的图标,单击时,应用程序可以获得项目信息,在我的情况下,IP。
      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2016-08-15
      • 2018-08-04
      • 2021-11-06
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多