Russian Qt Forum

Qt => Вопросы новичков => Тема начата: vanix от Июня 08, 2011, 16:24



Название: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 16:24
Вообщем строки не сравниваются хотя имеют одинаковое значение
Код:
bool VEContainer::searchObject(QTreeWidgetItem *item){
    foreach(VEWall obj, objectWallList){
        if (obj.getName() == item->text(0)){
            findWall = &obj;
            return true;
        }
    }
    return false;
}


Название: Re: Сравнение строк
Отправлено: LisandreL от Июня 08, 2011, 16:31
1) Непечатных символов нет?
2) obj.getName() покажите


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 16:38
Это абстрактный класс от которого наследуется VEWall;
header:
Код:
#ifndef VETYPE_H
#define VETYPE_H

#include "veobject.h"
#include <QString>

class VEType : public VEObject{
private:
    //fields
    QString name;

    //methods

protected:
    //fields

    //methods

public:
    //fields

    //methods
    VEType(QString name0 = 0);
    void setName(QString name0);
    QString getName();

};

#endif // VETYPE_H

cpp:
Код:
#include "vetype.h"

VEType::VEType(QString name0):
    VEObject(){
    name = name0;
}

void VEType::setName(QString name0){
    name = name0;
}

QString VEType::getName(){
    return name;
}
главное что стоит отметить, когда добавляется item в качестве текста берется name объекта VEWall


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 16:50
может имеется метод сравнения строк как, например, в java equals, хотя почитал документацию к QString и не нашел ничего подобного


Название: Re: Сравнение строк
Отправлено: Авварон от Июня 08, 2011, 17:05
qDebug'ом выведите. я тут вижу как минимум косяк с тем, что вы получаете адрес локальной переменной, но на сравнение это влиять не должно. и кода маловато


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 17:09
я тут вижу как минимум косяк с тем, что вы получаете адрес локальной переменной
поконкретней, пожалуйста.


Название: Re: Сравнение строк
Отправлено: Fat-Zer от Июня 08, 2011, 17:11
посмотрите, size() у них одинаковый или нет...
и ещё get/setName лучше передавать/получать по ссылке.


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 17:21
size одинаковый


Название: Re: Сравнение строк
Отправлено: Авварон от Июня 08, 2011, 17:28
&obj;


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 17:32
&obj;
а так нельзя делать?


Название: Re: Сравнение строк
Отправлено: sendevent от Июня 08, 2011, 17:34
может имеется метод сравнения строк как, например, в java equals, хотя почитал документацию к QString и не нашел ничего подобного
QString::compare (http://doc.qt.nokia.com/latest/qstring.html#compare-5) - не то?
---
и вот еще:
QString::localeAwareCompare (http://doc.qt.nokia.com/latest/qstring.html#localeAwareCompare)


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 17:46
через compare заработало, можно закрыть тему, а можно еще поразбираться, могу предоставить необходимые исходники.
спасибо всем и в частности sendevent. :)


Название: Re: Сравнение строк
Отправлено: Авварон от Июня 08, 2011, 17:52
нет, не заработало. компаре возвращает 0 (фолс) если строки равны.


Название: Re: Сравнение строк
Отправлено: kambala от Июня 08, 2011, 17:57
&obj;
а так нельзя делать?
ты сохраняешь ссылку на локальную переменную, а так делать нельзя. раз у тебя массив всех возможных значений уже есть, не проще ли просто запомнить индекс искомого элемента?

хм, может я и не прав...


Название: Re: Сравнение строк
Отправлено: vanix от Июня 08, 2011, 18:14
&obj;
а так нельзя делать?
ты сохраняешь ссылку на локальную переменную, а так делать нельзя. раз у тебя массив всех возможных значений уже есть, не проще ли просто запомнить индекс искомого элемента?

хм, может я и не прав...
проблемка в том что класс VEContainer содержит списки объектов разных типов в том числе vewall и vecontainer, в свою очередь объекты типа vecontainer использут ту же организацию. при поиске по имени легче вернуть и сохранить ссылку на объект чем указывать индекс и к какому конкретному списку конкретного контейнера относится индекс: что бы было понятно приведу следующую схему:
VEContainer con1
  QList<VEWall> // wall1, wall2, wall3
  QList<VEContainer>
  // con2
    //QList<VEWall> //wall4, wall5, wall6
    //QList<VEContainer>  //con3
  // con4
    .......
Проходя по всей иерархии мы в итоге возвращаем ссылку в con1
Вообщем это может быть непонятно, и возможно я не прав, так как использую qt меньше полгода и не знаю всех нюансов.


Название: Re: Сравнение строк
Отправлено: Авварон от Июня 08, 2011, 18:33
foreach(VEWall obj, objectWallList){
жирным выделено создание копии объекта, лежащего в списке.