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);
}
2 回答
QListWidgetItem
有成员函数和
用于存储任意数据(包括
QString
) . 设置role = Qt::UserRole
(或任何更高的值) .要在类层次结构中上下移动,可以使用强制转换,在本例中为dynamic_cast:
您可以将其用作信号和插槽的参数 . 这将告诉接收函数“嘿,这曾经是QListWidgetItem上的指针,所以对待就好了!”
要显示更多信息,您应该考虑使用QTableWidget . 我认为这符合您的要求,您不必像往常一样绕过“走私”信息;-)
Edit:
作为对您评论的回复:
看看QTableWidgetItem . 你会看到,QTableWidgetItem也可以有一个图标:-)所以你需要做的是,将你的信息分成几个QTableWidgetItems . 你有一个图标的项目,文本的项目,另一个文本和你需要的项目 .
现在每个_967398都是你之前作为ListWidget中的一个项目所拥有的 . 现在,只要用户点击某处,您就会使用信号
cellClicked( int row, int column )
和row
告诉您哪一行已被点击 . 现在您已经点击了行,可以获得您正在寻找的信息 .让我们说用户点击了第4行 . 每行都有列 . 第一列包含图标,第二列包含名称 . 现在特别的事情:第三列包含IP,但是被隐藏了 . 您可以使用
hideColumn( int column )
来执行此操作 .第4行:[第0列:图标|第1列:名称|第2栏:(隐藏)IP]
因此,每次用户单击一行时,您只需在第2列中查找IP .
当然你可以添加任意数量的单元格...一个包含带有名称的字符串,另一个带有描述......然后我们只说,最后一列是带有IP的隐藏列 .
您还可以使用
setShowGrid( false )
使网格不可见 . 现在它看起来像一个正常的信息显示,其中每一行都是一个项目 .:-)
Edit 2:
为了告诉你我的意思我实现了一个小例子 . 请参阅下面的代码 .
现在我们有一个没有水平 Headers 网格的表格(当然你不需要) . 单击一行时,将选择整行并调用以下插槽:
这只是我快速写的一个简单例子......当然有更好的方法可以做到这一点,但也许它有助于解决您的问题 .