在qt中获得正确的项目版本

get correct version of item in qt

本文关键字:项目 版本 qt      更新时间:2023-10-16

我有一个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()

        }
    }

您可以在您的QListWidgetItem s中保存其他用户定义的数据,例如您可以保存该效果的所有参数。使用setDatadata函数进行存储和检索。例子:

//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位的差异等)。