Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Март 10, 2016, 09:51



Название: Как изменить текст в header-е QFileSystemModel?
Отправлено: billy4685 от Март 10, 2016, 09:51
Доброе утро! На днях у меня появилась необходимость изменить стандартные надписи (Name, Size, Type Date, Modified) в header-е QFileSystemModel на свои (Название, Размер, Тип, Дата изменения). На первый взгляд простая задача, но увы никак не получается это реализовать.  ???
На форме я разместил QTreeView, и написал следующий код:
Код:
	QFileSystemModel *model = new QFileSystemModel(this);
model->setHeaderData(0, Qt::Vertical, tr("Название"), Qt::DisplayRole);
model->setHeaderData(1, Qt::Vertical, tr("Размер"), Qt::DisplayRole);
model->setHeaderData(2, Qt::Vertical, tr("Тип"), Qt::DisplayRole);
model->setHeaderData(2, Qt::Vertical, tr("Дата изменения"), Qt::DisplayRole);

QModelIndex index;
index = model->setRootPath("P:\\");
ui->treeView->setModel(model);
ui->treeView->setRootIndex(index);
думал должно сработать )), но увы надписи все равно стандартные (рисунок ниже).
Проблем с QTreeWidget или QableWidget с подобными ситуациями не возникало, там все срабатывает.
Может кто знает как правильно задавать текст header-у для QFileSystemModel?


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: __Heaven__ от Март 10, 2016, 11:12
Можно попробовать наследоваться от этой модели и переопределить метод QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: gil9red от Март 10, 2016, 11:41
setHeaderData у QFileSystemModel не переопределен, поэтому нужно создать свой. Набросал минимальный работающий пример:

Код
C++ (Qt)
#include <QFileSystemModel>
#include <QTreeView>
#include <QHeaderView>
#include <QMap>
 
class FileSystemModel: public QFileSystemModel {
private:
   QMap<int, QVariant> headers;
 
public:
 
   bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) {
       headers[section] = value;
       return true;
   }
 
   QVariant headerData(int section, Qt::Orientation orientation, int role) const {
       if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
           return headers[section];
       }
 
       return QVariant();
   }
};
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QFileSystemModel *model = new FileSystemModel();
   model->setHeaderData(0, Qt::Horizontal, QObject::tr("Название"), Qt::DisplayRole);
   model->setHeaderData(1, Qt::Horizontal, QObject::tr("Размер"), Qt::DisplayRole);
   model->setHeaderData(2, Qt::Horizontal, QObject::tr("Тип"), Qt::DisplayRole);
   model->setHeaderData(3, Qt::Horizontal, QObject::tr("Дата изменения"), Qt::DisplayRole);
 
   QTreeView* treeView = new QTreeView();
   treeView->setModel(model);
   treeView->setRootIndex(model->setRootPath("C:\\"));
   treeView->show();
 
   return a.exec();
}
 


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: Hellraiser от Март 10, 2016, 11:50
Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: gil9red от Март 10, 2016, 12:24
Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.
;D


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: __Heaven__ от Март 10, 2016, 14:05
Простота хуже воровства!
Шутка  :)


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: billy4685 от Март 11, 2016, 13:37
Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.
да уж)) как я не додумался)) спасибо)) раньше поступал так же с QCalendar.


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: billy4685 от Март 11, 2016, 13:52
 ??? Вот только как сделать QFileSystemModel переводимым (ну или сам текст в header-е)? Я ж его кодом создаю. Свойство переводимости раньше просто задавал в дизайнере, в коде пока его не использовал, так что не знаю как зовется эта функция. Для календаря раньше при выборе языка просто заганял его используя метод setLocale().  У QFileSystemModel его даже нет.


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: gil9red от Март 11, 2016, 13:57
Сделайте перевод, а после его подгрузите:

Код
C++ (Qt)
QTranslator * translator = new QTranslator();
translator->load( fileInfo.dir().path() + "/" + fileName );
qApp->installTranslator( translator );


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: billy4685 от Март 11, 2016, 15:28
Сделайте перевод, а после его подгрузите:

Код
C++ (Qt)
QTranslator * translator = new QTranslator();
translator->load( fileInfo.dir().path() + "/" + fileName );
qApp->installTranslator( translator );
Это я знаю) В окне где создаю QFileSystemModel, даже создал метод changeEvent():
Код:
void MyWindow::changeEvent(QEvent *event)
{
  if(event->type() == QEvent::LanguageChange)
  {
mainwindow->ui->retranslateUi(mainwindow);

mainwindow->ui->treeView->setLocale(my_win->locale());
  }
  else
QMainWindow::changeEvent(event);
}
Но вот как для самой модели сделать перевод так и не понял. Надписи (Name, Size, Type, Data Modified) остаются не переведенными.
Помню как-то в QTreeWidget-е делал перевод надписей. Тогда его создавал в дизайнере, и в самом QTreeWidget-е для надписей в header-е
выставлял в дизайнере свойство "переводимый". Тогда перевод срабатывал. А теперь вот на форму в дизайнере добавил QTreeView, а в коде
создал QFileSystemModel и его уже разместил на QTreeView. Перевод не срабатывает. Понимаю, что нужно как-то для надписей header-а
в QFileSystemModel выставить кодом это свойство "переводимый", но увы не знаю как((.


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: VPS от Март 11, 2016, 16:10
У меня так сработало ( для Qt4.8 ):
Код
C++ (Qt)
#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
#include <QTranslator>
#include <QLibraryInfo>
 
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
 
  QTranslator translator;
  translator.load("qt_ru", QLibraryInfo::location(QLibraryInfo::TranslationsPath));
  qApp->installTranslator(&translator);
 
  QFileSystemModel model;
  QTreeView treeView;
  treeView.setModel(&model);
  treeView.setRootIndex(model.setRootPath("C:\\"));
  treeView.show();
 
  return app.exec();
}


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: billy4685 от Март 11, 2016, 17:00
У меня в Qt 5.3.2 нет. (


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: __Heaven__ от Март 11, 2016, 17:50
Под виндой просто так не подсасываются стандартные переводы, на сколько я помню.


Название: Re: Как изменить текст в header-е QFileSystemModel?
Отправлено: VPS от Март 11, 2016, 18:13
У меня в Qt 5.3.2 нет. (
Здесь  (http://stackoverflow.com/questions/18979062/qt-dynamic-translation-of-dialog-windows?answertab=active#tab-top)человек пишет, что в Qt5.2 использовал другое имя файла.

P/S: у меня переводит под windows 7 x32 с qt4.8.7 и qt5.5.1