Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: проблема с DataS  (Read 5995 times)

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
проблема с DataS
« on: April 13, 2016, 05:13:16 pm »
У меня проблема следующая:

m_report->dataManager()->addModel(...) замечательно работает. Но до тех пор, пока я не сделаю локализацию, после этого
в списке полей отчета пропадает оригинально название поля, но появляется локализованное.

скажем поле city. В программе код setHeaderData(fieldIndex("city"),tr("City"));

Вот в limeReport и отображается как tr("City"), если в локализации Это "Город", то и будет Город. Крайне неудобно и похоже на баг (ну или фичу, если угодно :) ).

т.е. сделал отчет, локализовал программу - отчет заново творить. Сделал перевод на иной язык - отчет заново творить.

Копаю исходники, смотрю, где вместо fieldName подставляется headerName...

P.S. не исключено, что корни проблеммы одни, что описал drow в предыдущем топике

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: проблема с DataS
« Reply #1 on: April 13, 2016, 06:26:31 pm »
Итак...

Проблема в том, что lrdatadesignintf.cpp
в качестве названия поля берется headerName(). И это логично, поскольку в QAbstractItemModel это единственное свойство, определяющее текстовое обозначение столбца. Но нам от этого не легче...

Как вариант, для определения названия в report'е брать это же свойство, но, скажем, не c Qt::DisplayRole (по умолчанию), а с Qt::EditRole.
Ну и описать в мануале, что надо задавать два свойства для столбцов. Иначе будем сталкиваться с этой проблемой.

Вот код:

QString ModelToDataSource::columnNameByIndex(int columnIndex)
{
    if (isInvalid()) return "";
    return m_model->headerData(columnIndex,Qt::Horizontal).toString();  <----------------------------
}


Ну и, соответвенно, поправить смежные функции, такие как

int ModelToDataSource::columnIndexByName(QString name)

может, что-то еще, не копал пока дальше. Жду ответа и мнения от Алекса

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: проблема с DataS
« Reply #2 on: April 13, 2016, 06:43:28 pm »
Внес изменения, пересобрал, вроде работает

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: проблема с DataS
« Reply #3 on: April 13, 2016, 07:35:37 pm »
Тоже поправлю :) Думаю только посадить на Qt::UserRole

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: проблема с DataS
« Reply #4 on: April 13, 2016, 07:43:55 pm »
Вариант.
Но есть один ньюанс. Если разработчику данный момент непринципиален, то в случае EditRole ему не нужно писать дополнительный код. А в случае UserRole придется.

EditRole=DisplayRole, если не переопределено явно, а UserRole=QVariant()

тут уж смотри, как удобней.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: проблема с DataS
« Reply #5 on: April 13, 2016, 07:56:35 pm »
Да в общем можно и EditRole использовать :) Сейчас поиграюсь :) Отпишусь.

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: проблема с DataS
« Reply #6 on: April 13, 2016, 08:04:57 pm »
Ну как бы маловероятно, что кому-то в процессе работы с программой надо будет редактировать название полей. Вроде как вотчина программиста. Так что EditRole тут вполне безовасно использовать. Разве что, какой-то конструктор Модели будет делаться

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: проблема с DataS
« Reply #7 on: April 13, 2016, 09:14:51 pm »
Поигрался :) У меня получилось следующее :
setHeaderData() по умолчанию выставляет EditRole, а также устанавливает DisplayRole = EditRole.
если setHeaderData() не вызывается то EditRole = QVariant()
соответственно, для того, что бы разделить значения, все равно, надо вызывать setHeaderData() и для Qt::DisplayRole и для Qt::EditRole;
мне кажется, здесь у пользователей может возникнуть путаница :) А очевидных плюсов использования Qt::EditRole не вижу.
Возможно, я что-то упустил ?

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: проблема с DataS
« Reply #8 on: April 13, 2016, 11:10:07 pm »
Посадил все-таки на Qt::UserRole :) Пушнул на гитхаб.

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: проблема с DataS
« Reply #9 on: April 14, 2016, 04:18:08 am »
Да не, вроде, не упустил.
По сути разницы нету... Кусок кода для одной модели, заменить EditRole на USerRole - вроде не сложно :D
void TSpecialityModel::setHeaderNames()
 {
 setHeaderData(fieldIndex("id"),Qt::Horizontal,tr("ID"),Qt::DisplayRole);
 setHeaderData(fieldIndex("code"),Qt::Horizontal,tr("Code"),Qt::DisplayRole);
 setHeaderData(fieldIndex("speciality"),Qt::Horizontal,tr("Speciality"),Qt::DisplayRole);
 setHeaderData(fieldIndex("qualification_id"),Qt::Horizontal,tr("Qualification ID"),Qt::DisplayRole);
 setHeaderData(fieldIndex("qualification"),Qt::Horizontal,tr("Qualification"),Qt::DisplayRole);

 for (int i=0;i<record().count();i++)
  setHeaderData(i,Qt::Horizontal,record().fieldName(i),Qt::EditRole); <----------------------- тута
 return;
 }

Кстати, стоит наверное описать в хелпе, ситуация непрозрачная.