Russian Qt Forum
Сентябрь 28, 2024, 20:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: массив строк?  (Прочитано 14031 раз)
DmitryKSL
Гость
« : Май 31, 2010, 12:09 »

В чем хранить данные по пользователям, где будут 5 полей для каждого пользователя (ФИО, подразделение, должность и тд.) ? Заранее количество пользователей неизвестно, думаю не более сотни.
Дайте простой пример.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Май 31, 2010, 12:29 »

в структуре
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Май 31, 2010, 12:34 »

Ну тут два варианта, либо как говорит Авварон, в структуре, либо создать отдельный класс, разницы особой вроде нету.
Код:
struct User
{
     QString fio;
     QString doznost;
     QString podrazdelenie;

     ///blablabla
}

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

     QString fio;
     QString doznost;
     QString podrazdelenie;
///blablabla
}
Записан
mkv
Гость
« Ответ #3 : Май 31, 2010, 12:40 »

QMap как вариант...
Записан
DmitryKSL
Гость
« Ответ #4 : Май 31, 2010, 16:03 »

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

Хех. Все зависит от ситуации. Мне иногда нравится делать так typedef QHash<int, QStringList> myType;
int - уникальный идентификатор сотрудника.
QStringList(или структура на ваш вкус) - его данные.
Записан
crossly
Гость
« Ответ #6 : Май 31, 2010, 17:10 »

если хранить надо постоянно то может лучше в БД??
Записан
DmitryKSL
Гость
« Ответ #7 : Июнь 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 найти нужную строку, вернее ее индекс?
Записан
Sancho_s_rancho
Гость
« Ответ #8 : Июнь 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 необходимо реализовать оператор сравнения и присваивания.
Записан
DmitryKSL
Гость
« Ответ #9 : Июнь 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 в таком виде:
Логин
ФИО
Телефон
и т.д.
Т.е. в строке присутствуют переносы строки, и по ним как-то надо разбить строку на подстроки чтобы поместить их в мой класс. Как это сделать?
Записан
Sancho_s_rancho
Гость
« Ответ #10 : Июнь 01, 2010, 14:46 »

К тебе на вход приходит QByteArray, т.е. массив байтов. Чтобы дальше жилось спокойно надо его перегнать в юникодную QString.
Делаем как-то так
QTextCodec *inputEncoding = QTextCodec::codecForName(тут название кодировки в которой приходит);
QString str = inputEncoding->toUnicode( QByteArray входяший массив символов);
Затем можно попробовать строку разбить методом QString::split(), указав символом разбиения перевод строки.
Записан
SABROG
Гость
« Ответ #11 : Июнь 01, 2010, 20:09 »

Завязывайте вызывать tr() для каждой строки, никто не будет переводить слова типа "Вася" или "ул. Шпалерная д.5 кв.13" на английский или любой другой язык.
Записан
DmitryKSL
Гость
« Ответ #12 : Июнь 02, 2010, 11:55 »

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

Если вы не будете читать документацию, то удачи вам не видать, т.к. «удача сопутствует подготовленным умам».
find возвращает итератор на найденный элемент. Если элемент НЕ найден, то итератор указывает на несуществующий элемент под названием end (iterator QHash::end ()). Соответвенно сначала необходимо проверить не является ли полученный итератор этим самым концом. А потом, если не является то получить значение по этому адресу "*".
Записан
DmitryKSL
Гость
« Ответ #14 : Июнь 03, 2010, 04:52 »

Если вы не будете читать документацию, то удачи вам не видать
Я бы с радостью, только где взять документацию на русском? По F1 мне открывается справка, в которой пару заголовков обычно переведено. Может я не тот файл перевода скачал? В книгах не встречал полного описания классов, только то что нужно в рамках какой то задачи, а это совсем не то.

Ну эту проблему я решил:
Код:
    QHash <QString,userinfo>::const_iterator i=myBase.find("test");
    if (i !=myBase.end())
        {User = i.value();
        qDebug()<< User.FIO;}
Спасибо вам за помощь.
« Последнее редактирование: Июнь 03, 2010, 06:16 от DmitryKSL » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.