Qt:按属性查找列表中的对象

时间:2014-06-13 13:03:42

标签: c# c++ list qt properties

我是Qt的初学者,我更习惯用C#编程。所以我的问题是如何在Qt中实现C#代码:

public class MyObject 
{    
    private string myproperty;

    public string Myproperty 
    {
                get { return myproperty; }
                set { myproperty = value; }
    }    
}

private void button1_Click(object sender, EventArgs e) 
{
    List<MyObject> myobjectlist = new List<MyObject>();

    MyObject selectedobject = myobjectlist.Find(p => p.Myproperty == "Some name");               
}

是否可以在Qt中从列表中检索对象,如上面的代码?

4 个答案:

答案 0 :(得分:4)

这与Qt本身没什么关系。如果您可以使用C ++ 11,请使用lambda,就像在C#中一样:

auto itObj = std::find_if(
  myobjectlist.begin(), myobjectlist.end(),
  [](MyObject o) { return o.myproperty() == "Some name"; }
);
if (itObj != myobjectlist.end())
{
  // object was found, use *itObj (or itObj->) to access it/its members
}
else
{
  // object was not found
}

如果没有C ++ 11,你必须手工创建一个用operator()作为谓词的类,或者手工编写一个for循环。

答案 1 :(得分:2)

也许这样?

void MyClass::button1_Click() 
{
    QList<MyObject> myobjectlist;
    MyObject selectedobject;
    foreach (const MyObject &o, myobjectlist) {
        if (o.property("Some name").isValid()) {
            selectedobject = o;
            break;        
        }
    }
}

假设MyObjectQObject

答案 2 :(得分:1)

添加到.pro文件 CONFIG + = c ++ 11

#include <QString>
#include <QList>
#include <algorithm>
//...
//...
class MyObject
{
private:
    QString myproperty;
public:

   void MypropertySet(QString s)
   {
       myproperty=s;
   }
   QString MypropertyGet() const
   {
       return myproperty;
   }
};



void MainWindow::on_pushButton_clicked()
{
    QList<MyObject> myobjectlist;
    MyObject selectedobject=*std::find_if(myobjectlist.begin(), myobjectlist.end(),[] (const MyObject& s) { return s.MypropertyGet()=="Some name"; });

}

主窗口有一个按钮,当您单击它时,将调用主窗口中的privete插槽 on_pushButton_clicked()。如果您有更多问题,我可以发布整个文件。如果您不确定要查找的对象是否在列表中,则必须检查是否找到了该对象。

答案 3 :(得分:-3)

怎么样

MyObject selectedobject = myobjectlist.Where(p => p.Myproperty == "Some name")
                                      .FirstOrDefault();