0

我有一个QListWidget我使用它的图像过滤器列表,这个过滤器是通过上下文菜单添加的,我重新实现了 contextMenuEvent,我有 2 个上下文菜单:添加过滤器菜单和删除过滤器菜单,当我添加过滤器时,我只是将项目添加到列表中这 :

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()


        }
    }
4

1 回答 1

1

您可以在QListWidgetItems 中保存其他用户定义的数据,例如,您可以保存效果的所有参数。使用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 位差异等)。

于 2013-03-28T12:03:13.170 回答