C++ 获取qt中项目的正确版本

C++ 获取qt中项目的正确版本,c++,qt,C++,Qt,我有一个QListWidget,我使用它为图像创建了一个过滤器列表,这个过滤器是通过上下文菜单添加的,我重新实现了contextMenuEvent,我有两个上下文菜单:addfilter菜单和deletefilter菜单,当我添加过滤器时,我只需向列表中添加如下项: MenuFiler::MenuFiler() { Laplace = new QAction("Laplace" , this); QObject::connect(Laplace , SIGNAL(trigger

我有一个
QListWidget
,我使用它为图像创建了一个过滤器列表,这个过滤器是通过上下文菜单添加的,我重新实现了contextMenuEvent,我有两个上下文菜单: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
}
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()


        }
    }

您可以在
QListWidgetItem
s中保存其他用户定义的数据,例如,您可以保存效果的所有参数。使用
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
是您可以保存数据的第一个位置,您可以在接下来的位置保存任意数量的数据。这取决于您是否保存并获得正确的类型

但是,在您的情况下,一种更简单的方法可能是在结构或其他东西中存储一个指向实际效果的数字,或者您甚至可以保存一个指向包含参数的
Laplacianeffect
类的指针

编辑:用于存储指针:

存储指针可能有点棘手,标准类型系统兼容的方法是,但是作为一种简单的替代方法,您可以将指针强制转换到
uintptr\t
并保存它们,在检索它们时将它们强制转换回您的指针类型


但是,如果您想尝试第二种方法,我建议您要么使用第一种方法,要么阅读更多关于指针整数转换的内容(因为误用强制转换可能会很危险,原因是32位和64位的差异等等)。

谢谢您的回复,但我想在运行时双击事件时检测它,任何帮助因此,当您将项目插入QListWidget时,请使用
item->setData(…)
保存(例如)指向包含参数的Laplacianeffect类的指针。当用户选择项目时,您可以使用
item->data(…)
检索指针并获取实际参数。