Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kadr от Август 19, 2010, 12:29



Название: QTreeWidget
Отправлено: kadr от Август 19, 2010, 12:29
У меня есть пару вопросов:
1. Есть 2 QTreeWidget, в них загружаются все содержимое разных директорий, при входе в директорию там появляется итем с таким содержимым - .., надо что бы эта строка всегда была наверху, не зависимо от сортировки?
2. Имеется кнопка просмотр, при нажатии на которую в блокноте открывается текущий документ, как задать условие, по которому будет определятся в каком поле(QTreeWidget) сейчас стоит активный курсор, одним словом из какого поля нужно открывать файл?


Название: Re: QTreeWidget
Отправлено: Авварон от Август 19, 2010, 12:36
1)
flags QDir::Filters
flags QDir::SortFlags
2) SelectionModel, SelectedIndexes, QFileSystemModel::path(QModelIndex)


Название: Re: QTreeWidget
Отправлено: kadr от Август 19, 2010, 14:47
Мне не надо фильтровать и сортировать, надо что бы наряду с другими файлами и папками эти 2 точку (..) были на самом верху, притом в QTreeWidget включена сортировка.


Название: Re: QTreeWidget
Отправлено: Авварон от Август 19, 2010, 14:53
блин, мне казалось что это можно указать... А что дает QDir::LocaleAware? попробуй отнаследоваться от модели и переопределить sort


Название: Re: QTreeWidget
Отправлено: kadr от Август 19, 2010, 15:21
Как вот это можно указать, мне надо что бы сортировать можно было по нажатию мышкой на заголовке, например по Имени или типу и тд. А эти 2 точку не должны при этом сортироваться, постоянно быть наверху, ну как в тотоле!
Может быть в свойствах QTreeWidget есть возможность выставить, что бы .. были всегда наверху.


Название: Re: QTreeWidget
Отправлено: kadr от Август 20, 2010, 07:01
2) SelectionModel, SelectedIndexes, QFileSystemModel::path(QModelIndex)
Я может быть не правильно выразился, как определить какой элемент в данный момент имеет фокус, активен.


Название: Re: QTreeWidget
Отправлено: Авварон от Август 20, 2010, 08:28
SelectionModel


Название: Re: QTreeWidget
Отправлено: kadr от Август 20, 2010, 09:06
SelectionModel
Я никак не врюблюсь как с ним работать, можно маленько поконкретнее.
Да и еще не подскажите, как заставить в QTreeWIdget при нжатии на кнопку, выделение перемещаться на один уровень вниз, то есть у меня выделен один итем, при нажатии на кнопку выделение переходит на другой итем?


Название: Re: QTreeWidget
Отправлено: Авварон от Август 20, 2010, 09:30
эхх
Код:
{
    QItemSelectionModel *selectionModel = view->selectionModel();
    QModelIndexList indexes = selectionModel->selectedIndexes(); // или selectedRows
    foreach(QModelIndex index, indexes) {
        qDebug() << model->filePath(index); // печатаем выделенные файлы
    }
    selectionModel->clear();
    QModelIndex index = model->index("/"); // индекс корня в линупсе
    selectionModel->select(index); // выделен рут
}


Название: Re: QTreeWidget
Отправлено: crossly от Август 20, 2010, 11:35
а чем продиктовано использование QTreeWidget??


Название: Re: QTreeWidget
Отправлено: kadr от Август 20, 2010, 12:32
а чем продиктовано использование QTreeWidget??
Нужно работать в файловой системой, как в файловом менеджере.


Название: Re: QTreeWidget
Отправлено: crossly от Август 20, 2010, 12:47
дык QFileSystemModel + QTreeView избавит от лишнего геморроя...


Название: Re: QTreeWidget
Отправлено: Авварон от Август 20, 2010, 12:53
хех, а слона-то я и не заметил:) думал у него model-based


Название: Re: QTreeWidget
Отправлено: kadr от Август 20, 2010, 13:02
дык QFileSystemModel + QTreeView избавит от лишнего геморроя...
А я использую QTreeWidget!


Название: Re: QTreeWidget
Отправлено: Авварон от Август 20, 2010, 13:29
да, 1й строчкой setRootIndex


Название: Re: QTreeWidget
Отправлено: crossly от Август 20, 2010, 14:08
Согласен, QTreeView покруче будет, но мне не нравиться у него вид, как его можно изменить и вообще можно ли это? Мне нужно что бы не ввиде дерева была, а ввиде подробного списка.

послушайте... вы перед тем как постить документацию читать пробовали... ?? по вопросу... setRootIsDecorated(false)


Название: Re: QTreeWidget
Отправлено: kadr от Август 20, 2010, 15:28
Согласен, QTreeView покруче будет, но мне не нравиться у него вид, как его можно изменить и вообще можно ли это? Мне нужно что бы не ввиде дерева была, а ввиде подробного списка.

послушайте... вы перед тем как постить документацию читать пробовали... ?? по вопросу... setRootIsDecorated(false)
Да спасибо, я уже нашел как сделать.
Помоги разобраться с этим куском кода, почему то при выполнении его возникает ошибка и приложение закрывается.
Код:
if (event->type() == QEvent::KeyPress)
         {
             //QDir dir;
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             QFileSystemModel *model = new QFileSystemModel;
             if (keyEvent->key()==Qt::Key_Return)
             {

                 if(model->fileInfo(ui->left_pole->currentIndex()).isFile())
                    {
                        return false;
                    }
                 else
                    {
                        left_pole_update(ui->left_pole->currentIndex());

                    }
             }
         }

Код:
ASSERT: "index.model() == q" in file dialogs\qfilesystemmodel.cpp, line 1270
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.


Название: Re: QTreeWidget
Отправлено: crossly от Август 20, 2010, 16:02
что вы пытаетесь сделать объясните...

PS: что касается кода... он заработает только при оч удачном расположении звезд на небе....


Название: Re: QTreeWidget
Отправлено: kadr от Август 22, 2010, 14:51
я отлавливаю нажатие кнопки enter и затем проверяю, является ли текущая строка, а точнее содержимое текущего итема, папкой или файлом, если файл, то выйте из функции, иначе зайти в текущую директорию.
Код:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
if (event->type() == QEvent::KeyPress)
         {
             //QDir dir;
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             QFileSystemModel *model = new QFileSystemModel;
             if (keyEvent->key()==Qt::Key_Return)
             {

                 if(model->fileInfo(ui->left_pole->currentIndex()).isFile())
                    {
                        return false;
                    }
                 else
                    {
                        left_pole_update(ui->left_pole->currentIndex());

                    }
             }
         }



return QMainWindow::eventFilter(obj, event);

 }
 


Название: Re: QTreeWidget
Отправлено: crossly от Август 22, 2010, 15:01
во первых .... вы создаете в фильтре новую модель... которая абсолютно никакого отношения к вашей модели и вью не имеет.... я так полагаю это и есть источник сегфолта... во вторых не проще ли воспользоваться сигналом activated... и в третьих... воспользоваться все же моим советом и начать читать документацию... :)


Название: Re: QTreeWidget
Отправлено: kadr от Август 22, 2010, 16:08
во первых .... вы создаете в фильтре новую модель... которая абсолютно никакого отношения к вашей модели и вью не имеет.... я так полагаю это и есть источник сегфолта... во вторых не проще ли воспользоваться сигналом activated... и в третьих... воспользоваться все же моим советом и начать читать документацию... :)
Хорошо, спасибо за совет!


Название: Re: QTreeWidget
Отправлено: kadr от Август 23, 2010, 15:04
Я так и не услышал ответ на вопрос- как мне определить, как из 2 QTreeView в данный момент активен, поясняю:
Есть 2 TreeView, перход между ними осуществляется табом и кликом мыши, так же есть кнопка при нажатии на которую должно происходить следующее, берется полный путь текущей записи, в моем случае это текстовый файл, и открывается в блокноте.Так то все работет, но файл открывается постоянно один и тотже из первого TreeView-а. Как мне определить в каком TreeView-е сейчас находиться курсор?
 
Код:
QItemSelectionModel *selectionModel = view->selectionModel();
    QModelIndexList indexes = selectionModel->selectedIndexes(); // или selectedRows
    foreach(QModelIndex index, indexes) {
        qDebug() << model->filePath(index); // печатаем выделенные файлы
    }
    selectionModel->clear();
    QModelIndex index = model->index("/"); // индекс корня в линупсе
    selectionModel->select(index); // выделен рут
Этот код не катит, он показывает какие строки выбраны в определеном TreeView-е, а мне надо другое!


Название: Re: QTreeWidget
Отправлено: crossly от Август 23, 2010, 15:06
hasFocus()


Название: Re: QTreeWidget
Отправлено: Авварон от Август 23, 2010, 15:12
QApplication::focusWidget


Название: Re: QTreeWidget
Отправлено: kadr от Август 23, 2010, 15:44
hasFocus()
Вот спасибо!


Название: Re: QTreeWidget
Отправлено: crossly от Август 23, 2010, 16:19
и опять же... документация...


Название: Re: QTreeWidget
Отправлено: kadr от Август 24, 2010, 09:11
помогите разобраться, хочу создать новую папку и не пойму что ему надо.
mkdir ( const QModelIndex & parent, const QString & name )

Код:
model_l->mkdir(?,filename);
Я так понял что ему нужно указать родителя, а как указать не пойму.
У меня есть QTreeView - ui->left_pole
QFileSystemModel *model_l;

В справке ничего толком нет, в инете тоже ничего не нашел!


Название: Re: QTreeWidget
Отправлено: crossly от Август 24, 2010, 09:23
ну если в справке нету... то нам откуда знать... :))... читайте книги товарисч... я бы на вашем месте начал с c++... потом потиху Бланшета, Шлее


Название: Re: QTreeWidget
Отправлено: kadr от Август 24, 2010, 09:28
Спсб!


Название: Re: QTreeWidget
Отправлено: crossly от Август 24, 2010, 09:35
ну а вообще если хотите посмотреть на эффект... попробуйте ui->left_pole->currentIndex() или ui->left_pole->currentIndex()->parent() к примеру... желательно их конечно же на валидность проверить...


Название: Re: QTreeWidget
Отправлено: kadr от Август 24, 2010, 15:46
ну а вообще если хотите посмотреть на эффект... попробуйте ui->left_pole->currentIndex() или ui->left_pole->currentIndex()->parent() к примеру... желательно их конечно же на валидность проверить...
ui->left_pole->currentIndex()  - это не работает.
ui->left_pole->currentIndex()->parent() - а это работает!


Название: Re: QTreeWidget
Отправлено: kadr от Август 25, 2010, 12:23
Помогите, мне нужно рекурсивно считывать содержимое папок, для дальнейшего копирования этого содержимого. Я накатал кое какой алгоритм, но он не правильно отрабатывает.
Код:
QStringList Linux_Comander::scanfolder(QString path)
{
    dir_f.cd(path);
    dir_f.setSorting(QDir::DirsFirst);
    while(i_f != dir_f.count())
    {
        if ((dir_f.entryInfoList().value(i_f).isDir()) && (dir_f.entryList().value(i_f) != ".") && (dir_f.entryList().value(i_f) != ".."))
        {
           map_fs.append(dir_f.entryList());
           i_f++;
           scanfolder(dir_f.entryList().value(i_f));
        }
       
    }
            return map_fs;
  }
Мне надо куда то воткнуть dir_f.cdUp(), я не знаю куда! Подскажите как правильно это сделать, или может быть есть способ попроще, мне нужно, что бы при нажатии кнопки копировать, все содержимое папки, включая и вложеные папки с их содержимым, скопировалось в указанное место!


Название: Re: QTreeWidget
Отправлено: Kolobok от Август 25, 2010, 13:52
QDirIterator?


Название: Re: QTreeWidget
Отправлено: kadr от Август 25, 2010, 15:47
А есть в Qt какая нибудь функция, которая может скопировать всю папку с вложенными папками и файлами, челиком?  ???


Название: Re: QTreeWidget
Отправлено: crossly от Август 25, 2010, 15:55
а может меда на блюдечки... ??:)


Название: Re: QTreeWidget
Отправлено: kadr от Август 26, 2010, 07:01
а может меда на блюдечки... ??:)
Значит нет!


Название: Re: QTreeWidget
Отправлено: kadr от Август 26, 2010, 15:58
Вот код для рекурсивного копирования файлов и подкаталогов!
Код:
void Linux_Comander::CopyFolder(QString strFrom, QString strTo)
{

  QDir dir;

  QFile file;
  //strFrom - имя папки, откуда  копировать
  //strTo - имя папки, куда  копировать

  //убедимся, что имена заканчиваются слэшем, если нет - добавим
  if (strTo.right(1) != "")
     strTo += '/';
  if (strFrom.right(1) != "")
     strFrom += '/';

  //создаем ("копируем") текущую папку

  dir.mkdir(strTo);
    qDebug() << strTo;
  //будем перебирать все файлы и папки в текущей


  QDirIterator itr(strFrom,QDirIterator::Subdirectories);
  while(itr.hasNext())
  {

     QString strFilePath = itr.filePath();
     QString strFileTitle = itr.fileName();


     //отсекаем "." и ".."
     if (itr.fileName() != "." && itr.fileName() != "..")
     {
        if (itr.fileInfo().isDir())
           //рекурсивное погружение в найденную папку (strTo + strFileTitle)
           CopyFolder(strFilePath, strTo + strFileTitle);
        else
           //просто копируем файл
           file.copy(strFilePath, strTo + strFileTitle);
     }
     itr.next();
  }



}


Название: Re: QTreeWidget
Отправлено: kadr от Август 27, 2010, 07:24
Народ помогите разобраться, у меня есть алгоритм рекурсивного удаления папок вместе с их содержимым, работает впринципе нормально, но вот проблема, если перед удалением зайти в удаляемый каталог, то при удалении он пишет:
Код:
QFileSystemWatcher: FindNextChangeNotification failed!! (???????? ? ???????.)
А после перезагрузки приложения папки уже нет.
Код:
bool Linux_Comander::clearAndRemoveDirectory(QString  dir)
    {
            QDir dirObj(dir);
            foreach (QString fileName, dirObj.entryList())
            {
                    if (fileName == "." || fileName == "..") continue;
                    if (QFileInfo(dirObj.filePath(fileName)).isDir())
                    {
                            clearAndRemoveDirectory(dirObj.filePath(fileName));
                    }
                    else
                    {
                            dirObj.remove(fileName);
                    }
            }

            if (!dirObj.rmdir(dir))
            {
                QMessageBox::information(this,"Ошибка удаления","Не удалось удалить временную директорию "+dir);
                return false;
            }
            left_pole_update(model_l->index(ui->adress_line_left->text().trimmed()));
            right_pole_update(model_r->index(ui->adress_line_right->text().trimmed()));
            return true;
    }