crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Не могу понять что не так в QFileSystemModel
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 12.7.2010, 11:49
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


Доброго времени сутрок.
Недавно на багтрекере Qt я запостил багу, на мой взгляд, критичную.
Не вызывался метод paintEvent для виджетов внутри QFormLayout, но самое интересное не всегда, а только в случае запуска с ключиком -style plastique или -style mac.
И Вот не прошло и месяца я на пороге нового открытия)
Товарищи помогите разобраться:
вот код
Раскрывающийся текст
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


Раскрывающийся текст
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileSystemModel>
#include <QLineEdit>
#include <QPushButton>
#include <QTableView>
#include <QVBoxLayout>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    void init();
    QFileSystemModel * model_;
    QWidget * centralWidget_;
    QLineEdit * lineEdit_;
    QPushButton * pushButton_;
    QTableView * view_;

    QVBoxLayout * layout_;
private slots:
    void on_pushButton_clicked();

};

#endif // MAINWINDOW_H

Раскрывающийся текст

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    model_(new QFileSystemModel() )
{
    init();
}

MainWindow::~MainWindow()
{
    delete model_;
}

void MainWindow::init()
{
    centralWidget_ = new QWidget(this);
    setCentralWidget(centralWidget_);

    layout_ = new QVBoxLayout();
    pushButton_ = new QPushButton("UPDATE", this);
    lineEdit_ = new QLineEdit(this);
    view_ = new QTableView(this);

    layout_->addWidget(lineEdit_);
    layout_->addWidget(pushButton_);
    layout_->addWidget(view_);

    centralWidget_->setLayout(layout_);

    view_->setModel(model_);
    centralWidget_->show();

    connect(pushButton_, SIGNAL(clicked()),
            this, SLOT(on_pushButton_clicked()));
}

void MainWindow::on_pushButton_clicked()
{
    QString path = lineEdit_->text();

    QModelIndex index = model_->setRootPath(path);

    view_->setRootIndex(index);

    qDebug() << "current dir from model" << model_->rootPath()
            << "current dir from view" << view_->rootIndex().data().toString();
    
    qDebug() << "has index" << index->isValid();
    qDebug() << "has child" << model_->hasChildren(index);
    qDebug() << "first child " << model_->index(0,0,index).data().toString();
}


Если вы попробуете скомпилировать это, то должны получить вполне работоспособное приложение.
Работает, т.е. должно оно работать так...
вводите путь в lineEdit -> жмыкаете кнопку update -> view начинает показывать содержание директории
Эта часть работает корректно.
но внимание в консоль на вывод QDebug
Когда вы меняте путь и нажимаете кнопку в дебаге твориться нечто не понятное
в моем случае вывод таков

Раскрывающийся текст
current dir from model "/boot" current dir from view "boot"
has index false
has child true
first child ""

если нажать кнопку еще раз то...

Раскрывающийся текст
current dir from model "/boot" current dir from view "boot"
has index false
has child true
first child ""
current dir from model "/boot" current dir from view "boot"
has index true
has child true
first child "grub"

чем можно объяснить такое поведение???

Заранее благодарю всех заинтересовавшихся

Сообщение отредактировал ЙаМайскЫйПчОЛ - 12.7.2010, 19:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 12.7.2010, 22:33
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Если я правильно понял вопрос, тебя интересует, почему после смены корневого индекса ты не можешь получить данные о чайлдах этого индекса (first child "" ), а после второго нажатия - получаешь (first child "grub").
Для ответа достаточно посмотреть в ассистенте описание на класс QFileSystemModel
Цитата
Unlike the QDirModel, QFileSystemModel uses a separate thread to populate itself so it will not cause the main thread to hang as the file system is being queried.
Т.е. в момент когда ты делаешь model_->setRootPath(path) (точнее сразу после этого действия) у тебя нет информации о чайлдах устанавливаемого индекса. Если эта информация тебе нужна, подпишись на сигнал
Цитата
void QFileSystemModel::rootPathChanged ( const QString & newPath ) [signal]
, и в обработчике уже получай список чайлдов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 13.7.2010, 0:18
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


RTFM!!!!!!!!!!АААААААААААААААА
ладно спишем на ЖАРУ....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 13.7.2010, 13:41
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


Возникла проблема.
Я выставил дял QFileSystemModel setFilter(QDir::Files)
если я меняю директори, а потом перехожу на уровень выше этой директории, то кроме файлов отображаеться и название прошлой дирректории, т.е. как она попадает в представление??
Воопще в идеале я получаю список файлов в директории узнаю даты их создания а потом фильтрую, в проксирующей модели диапазоном дат
какая ирархия у этой модели... т.е. как обратится к файлам в директории, я запрашиваю child, но она возвращает только индекс дочерних директорий
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 13.7.2010, 14:18
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 154
Регистрация: 10.7.2008
Из: СПб
Пользователь №: 232

Спасибо сказали: 7 раз(а)




Репутация:   5  


Нашел способ полцчения списка дат для файлов.. но мне кажеться он кривоват... хотя что я знаю про дизайн
QDir dir = model_->rootDirectory();
    QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files, QDir::Time);
    for ( int i = 0; i != fileInfoList.count(); i++)
    {
        qDebug() << fileInfoList.at(i).created();
    }


Сообщение отредактировал Litkevich Yuriy - 13.7.2010, 16:34
Причина редактирования: используй тег code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 12:42