Russian Qt Forum

Qt => Общие вопросы => Тема начата: DmitryKSL от Май 31, 2010, 12:09



Название: массив строк?
Отправлено: DmitryKSL от Май 31, 2010, 12:09
В чем хранить данные по пользователям, где будут 5 полей для каждого пользователя (ФИО, подразделение, должность и тд.) ? Заранее количество пользователей неизвестно, думаю не более сотни.
Дайте простой пример.


Название: Re: массив строк?
Отправлено: Авварон от Май 31, 2010, 12:29
в структуре


Название: Re: массив строк?
Отправлено: ecspertiza от Май 31, 2010, 12:34
Ну тут два варианта, либо как говорит Авварон, в структуре, либо создать отдельный класс, разницы особой вроде нету.
Код:
struct User
{
     QString fio;
     QString doznost;
     QString podrazdelenie;

     ///blablabla
}

или
Код:
class User
{
     public:
          Class(){};

     QString fio;
     QString doznost;
     QString podrazdelenie;
///blablabla
}


Название: Re: массив строк?
Отправлено: mkv от Май 31, 2010, 12:40
QMap как вариант...


Название: Re: массив строк?
Отправлено: DmitryKSL от Май 31, 2010, 16:03
Ну тут два варианта, либо как говорит Авварон, в структуре, либо создать отдельный класс, разницы особой вроде нету.
Спасибо, об этом даже не подумал. Для меня это пока сложновато. У меня все данные строковые, я думал структура для разных типов данных придумана. В 1С,например, есть таблица значений, добавляешь нужные столбцы, потом строки по необходимости. Я думал что тут что-то подобное существует. В принципе, структура подойдет.
Насчет QMap ничего не понял. Здесь переводили, http://doc.crossplatform.ru/qt/4.5.0/mainclasses.html (http://doc.crossplatform.ru/qt/4.5.0/mainclasses.html) но куда ни зайду, в основном английский. Может где-то еще есть справочная документация на русском?


Название: Re: массив строк?
Отправлено: Sancho_s_rancho от Май 31, 2010, 16:36
Хех. Все зависит от ситуации. Мне иногда нравится делать так typedef QHash<int, QStringList> myType;
int - уникальный идентификатор сотрудника.
QStringList(или структура на ваш вкус) - его данные.


Название: Re: массив строк?
Отправлено: crossly от Май 31, 2010, 17:10
если хранить надо постоянно то может лучше в БД??


Название: Re: массив строк?
Отправлено: DmitryKSL от Июнь 01, 2010, 07:26
Хех. Все зависит от ситуации. Мне иногда нравится делать так typedef QHash<int, QStringList> myType;
int - уникальный идентификатор сотрудника.
QStringList(или структура на ваш вкус) - его данные.
Ничего не понял.Про структуру читал, как использовать для одного сотрудника разобрался. Как ее задействовать для группы сотрудников не понятно.
Короче начал писать класс. Такое ощущение что не то делаю.
Вот заголовочный файл:
Код:
#ifndef USERINFO_H
#define USERINFO_H

#include <QStringList>

class userinfo
{
public:
    void AddUser(QString &login,QString &fio,QString &telefon,QString &dolgnost,QString &podrazd,QString &mail,QString &adres);
    void Find(QString &login);
private:
    QStringList Login;
    QStringList FIO;
    QStringList Telefon;
    QStringList Dolgnost;
    QStringList Podrazd;
    QStringList Mail;
    QStringList Adres;
    int index;
};

#endif // USERINFO_H
Вот исходник:
Код:
#include "userinfo.h"

void userinfo::AddUser(QString &login,QString &fio,QString &telefon,QString &dolgnost,QString &podrazd,QString &mail,QString &adres)
{  Login.append(login);
   FIO.append(fio);
   Telefon.append(telefon);
   Dolgnost.append(dolgnost);
   Podrazd.append(podrazd);
   Mail.append(mail);
   Adres.append(adres);
}

void userinfo::Find(QString &login)
{

}
Немного уточню что надо.
1) Считываю данные из домена скриптом (заполняю ими мой класс - не сделано)
пока так записал в конструкторе моего приложения
Код:
 userinfo User;   
    QString login="test";
    QString fio="test";
    QString telefon="384";
    QString dolgnost="any";
    QString podrazd="IT";
    QString mail="mail.ru";
    QString adres="bobryisk";
    User.AddUser(login,fio,telefon,dolgnost,podrazd,mail,adres);
2) Получаю имя залогинившегося пользователя
3) По этому логину нахожу нужные данные в классе. Тут я понимаю надо добавить в класс строковые переменные. Они должны заполняться методом Find моего класса.
4) после вызова метода find считываю нужные свойства (переменные класса).
Теперь собственно вопрос. Имеет ли смысл такой подход или все можно сделать значительно проще? Как в QStringList найти нужную строку, вернее ее индекс?


Название: Re: массив строк?
Отправлено: Sancho_s_rancho от Июнь 01, 2010, 09:59
Код:
QString emp = QObject::tr("Вася"); //ключ, по которому будет производится поиск.
    QStringList empData; //заполняем все поля в необходимом порядке.
    empData.append(QObject::tr("слесарь"));
    empData.append(QObject::tr("ул. Ломоносова д.1 кв.1"));

    QString emp2 = QObject::tr("Коля");
    QStringList empData2;
    empData2.append(QObject::tr("сварщик"));
    empData2.append(QObject::tr("ул. Шпалерная д.5 кв.13"));


    typedef QHash<QString, QStringList> base; //наша база
    base myBase;
    myBase.insert(emp, empData); //заносим данные
    myBase.insert(emp2, empData2);

    //А теперь ищем работника
    QStringList l = *(myBase.find(QObject::tr("Вася")));
    qDebug()<<l;
    //Будем считать что они стали семьей и у них одна должность
    myBase[QObject::tr("Вася")] = empData2;
    l = *(myBase.find(QObject::tr("Вася")));
    qDebug()<<l;
Ну или вместо QStringList  используете класс userinfo наподобии
Код:
#ifndef USERINFO_H
#define USERINFO_H

#include <QString>

class userinfo
{
public:
    void AddUser(QString &login,QString &fio,QString &telefon,QString &dolgnost,QString &podrazd,QString &mail,QString &adres);
private:
    QString Login;
    QString FIO;
    QString Telefon;
    QString Dolgnost;
    QString Podrazd;
    QString Mail;
    QString Adres;
};

#endif // USERINFO_H
И соответсвенно typedef QHash<int, userinfo> base;
int - это уникальный идентификатор, т.к. Имена могут совпадать у разных людей. А userinfo - информация о них. Если предположить, что имена уникальны, то все становится совсем просто. QHash тебе все сам найдет.
ПИ.СИ.  Для userinfo необходимо реализовать оператор сравнения и присваивания.


Название: Re: массив строк?
Отправлено: DmitryKSL от Июнь 01, 2010, 12:07
int - это уникальный идентификатор, т.к. Имена могут совпадать у разных людей. А userinfo - информация о них. Если предположить, что имена уникальны, то все становится совсем просто. QHash тебе все сам найдет.
ПИ.СИ.  Для userinfo необходимо реализовать оператор сравнения и присваивания.
в качестве ключа, использовал login. Для текущей задачи достаточно.
Код:
  QString login="test";
    QString fio="test";
    QString telefon="384";
    QString dolgnost="any";
    QString podrazd="IT";
    QString mail="mail.ru";
    QString adres="bobryisk";
    User.AddUser(login,fio,telefon,dolgnost,podrazd,mail,adres);
    typedef QHash <QString,userinfo> base; //наша база
    base myBase;
    myBase.insert(login,User); //заносим данные
а вот так нельзя записать? - typedef QHash <userinfo> base; Чтобы ключ в самом классе был?
вот продолжение тестового кода, выводит то что и требуется :)
Код:
    login="test2";
    fio="test2";
    telefon="3842";
    dolgnost="any2";
    podrazd="IT2";
    mail="mail2.ru";
    adres="bobryisk2";

    User.AddUser(fio,telefon,dolgnost,podrazd,mail,adres);
    myBase.insert(login,User); //заносим данные
    //А теперь ищем работника
    stroka=tr("test");
    User = *(myBase.find(stroka));
    qDebug()<<User.FIO<<User.Telefon<<User.Dolgnost<<User.Podrazd<<User.Mail<<User.Adres;
    stroka=tr("test2");
    User = *(myBase.find(stroka));
    qDebug()<<User.FIO<<User.Telefon<<User.Dolgnost<<User.Podrazd<<User.Mail<<User.Adres;
Возникает следующий вопрос.
Код:
stroka=tr(myProcess->readAllStandardOutput());
         if (num==2) { qDebug()<< stroka;}
Скрипт выдает мне QString в таком виде:
Логин
ФИО
Телефон
и т.д.
Т.е. в строке присутствуют переносы строки, и по ним как-то надо разбить строку на подстроки чтобы поместить их в мой класс. Как это сделать?


Название: Re: массив строк?
Отправлено: Sancho_s_rancho от Июнь 01, 2010, 14:46
К тебе на вход приходит QByteArray, т.е. массив байтов. Чтобы дальше жилось спокойно надо его перегнать в юникодную QString.
Делаем как-то так
QTextCodec *inputEncoding = QTextCodec::codecForName(тут название кодировки в которой приходит);
QString str = inputEncoding->toUnicode( QByteArray входяший массив символов);
Затем можно попробовать строку разбить методом QString::split(), указав символом разбиения перевод строки.


Название: Re: массив строк?
Отправлено: SABROG от Июнь 01, 2010, 20:09
Завязывайте вызывать tr() для каждой строки, никто не будет переводить слова типа "Вася" или "ул. Шпалерная д.5 кв.13" на английский или любой другой язык.


Название: Re: массив строк?
Отправлено: DmitryKSL от Июнь 02, 2010, 11:55
Затем можно попробовать строку разбить методом QString::split(), указав символом разбиения перевод строки.
Большое спасибо за советы, с этим разобрался. Но вот нюанс один с
User = *(myBase.find(stroka));
Если ключ не найден, то моя программа вываливается с ошибкой. Как проверить существует ли такой ключ в базе?


Название: Re: массив строк?
Отправлено: Sancho_s_rancho от Июнь 02, 2010, 18:45
Если вы не будете читать документацию, то удачи вам не видать, т.к. «удача сопутствует подготовленным умам».
find возвращает итератор на найденный элемент. Если элемент НЕ найден, то итератор указывает на несуществующий элемент под названием end (iterator QHash::end ()). Соответвенно сначала необходимо проверить не является ли полученный итератор этим самым концом. А потом, если не является то получить значение по этому адресу "*".


Название: Re: массив строк?
Отправлено: DmitryKSL от Июнь 03, 2010, 04:52
Если вы не будете читать документацию, то удачи вам не видать
Я бы с радостью, только где взять документацию на русском? По F1 мне открывается справка, в которой пару заголовков обычно переведено. Может я не тот файл перевода скачал? В книгах не встречал полного описания классов, только то что нужно в рамках какой то задачи, а это совсем не то.

Ну эту проблему я решил:
Код:
    QHash <QString,userinfo>::const_iterator i=myBase.find("test");
    if (i !=myBase.end())
        {User = i.value();
        qDebug()<< User.FIO;}
Спасибо вам за помощь.