我有一个QListWidget
我使用它我们的图像过滤器列表,这个过滤器是通过上下文菜单添加的,我重新实现了contextMenuEvent,我有2个上下文菜单:addfilter菜单和deletefilter菜单,当我添加过滤器我只是将项目添加到列表中:
MenuFiler::MenuFiler()
{
Laplace = new QAction("Laplace" , this);
QObject::connect(Laplace , SIGNAL(triggered()) , this , SLOT(LaplaceSlot()) );
QObject::connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, `SLOT(ManageControls(QListWidgetItem*))); // to show controls for clicked item`
.
.
.
}
void MenuFiler::LaplaceSlot()
{
this->addItem("Laplace");
}
现在在其他功能上我检查是否有项目我得到这个项目文本并为这个过滤器创建控件,我这样做
void MenuFiler::ManageControls(QListWidgetItem*item)
{
if (item->text() == "Laplace")
{
if (_laplacianeffect.get() == NULL)
{
_laplacianeffect = unique_ptr<Laplacianeffect> (new Laplacianeffect());
}
_laplacianeffect.get()->show();
}
.
.
// etc
}
和控件只是链接到qframe的一些按钮和滑块,我在这里没有问题。 我的问题是当我想创建一个向量来保存重复的效果时,例如用户将此过滤器添加到代表过滤器列表的qListWidget:
拉普拉斯 其他影响 拉普拉斯
所以我会做这样的事情
void MenuFiler::LaplaceSlot()
{
_laplacianeffect.push_back(new Laplacianeffect() );
this->addItem("Laplace");
}
我如何检测巫婆过滤器被选中
void MenuFiler::ManageControls(QListWidgetItem*item)
{
if (item->text() == "Laplace")
{
// what is the code that i should use to detect witch effect id is selected)
_laplacianeffect.at(filterid).show()
}
}
答案 0 :(得分:1)
您可以在QListWidgetItem
中保存其他用户定义的数据,例如,您可以保存效果的所有参数。使用setData
和data
函数进行存储和检索。例如:
//Let these be the things you want to save for the filter.
int filterParameter1;
QString filterParameter2;
//etc...
//Save them in your QListWidgetItem* :
item->setData(Qt::UserRole + 0, filterParameter1);
item->setData(Qt::UserRole + 1, filterParameter2);
//Retrieve them later by having the QListWidgetItem* pointer:
filterParameter1 = item->data(Qt::UserRole + 0).toInt();
filterParameter2 = item->data(Qt::UserRole + 1).toString();
Qt::UserRole
是您可以保存数据的第一个地方,您可以在下一个地方保存尽可能多的数据。由您来确保保存并获得正确的类型。
但是在你的情况下,更简单的方法是存储一个指向结构或某物中实际效果的数字,或者你甚至可以保存一个指针指向你的{{ 1}}包含参数的类。
编辑:用于存储指针:
存储指针可能有点棘手,标准的类型系统兼容方式是described in this question,但作为一种简单的替代方法,您可以将指针转换为Laplacianeffect
并保存它们,并在检索它们时他们回到你的指针类型。
但是,如果你想尝试第二种方法,我建议你使用第一种方法或者更多地使用指针 - 整数转换(因为误用的转换可能是危险的,因为32位和64位差异等)。 / p>