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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как изменить текст в header-е QFileSystemModel?  (Прочитано 9313 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Март 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?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Март 10, 2016, 11:12 »

Можно попробовать наследоваться от этой модели и переопределить метод QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Март 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();
}
 
Записан

Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Март 10, 2016, 11:50 »

Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Март 10, 2016, 12:24 »

Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.
Смеющийся
Записан

__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Март 10, 2016, 14:05 »

Простота хуже воровства!
Шутка  Улыбающийся
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #6 : Март 11, 2016, 13:37 »

Да зачем такие сложности??? Надо подключить перевод - все колонки для QFileSystemModel уже переведены.
да уж)) как я не додумался)) спасибо)) раньше поступал так же с QCalendar.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #7 : Март 11, 2016, 13:52 »

 Непонимающий Вот только как сделать QFileSystemModel переводимым (ну или сам текст в header-е)? Я ж его кодом создаю. Свойство переводимости раньше просто задавал в дизайнере, в коде пока его не использовал, так что не знаю как зовется эта функция. Для календаря раньше при выборе языка просто заганял его используя метод setLocale().  У QFileSystemModel его даже нет.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Март 11, 2016, 13:57 »

Сделайте перевод, а после его подгрузите:

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

billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #9 : Март 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 выставить кодом это свойство "переводимый", но увы не знаю как((.
Записан
VPS
Гость
« Ответ #10 : Март 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();
}
« Последнее редактирование: Март 11, 2016, 16:12 от vps » Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #11 : Март 11, 2016, 17:00 »

У меня в Qt 5.3.2 нет. (
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Март 11, 2016, 17:50 »

Под виндой просто так не подсасываются стандартные переводы, на сколько я помню.
Записан
VPS
Гость
« Ответ #13 : Март 11, 2016, 18:13 »

У меня в Qt 5.3.2 нет. (
Здесь человек пишет, что в Qt5.2 использовал другое имя файла.

P/S: у меня переводит под windows 7 x32 с qt4.8.7 и qt5.5.1
« Последнее редактирование: Март 12, 2016, 12:20 от vps » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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