Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Май 03, 2014, 18:11



Название: Событие при клике на модель файлов
Отправлено: koldun90 от Май 03, 2014, 18:11
Добрый день уважаемые форумчане я делаю файловый менеджер посредством qfilesytemmodel+qtreeview.
Возникла у меня проблема небольшая проблема
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileSystemModel>
#include <QMessageBox>
#include <QString>
#include <QStringListModel>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_treeView_clicked(const QModelIndex &index);

    void on_treeView_2_clicked(const QModelIndex &index);

    void on_treeView_customContextMenuRequested(const QPoint &pos);

    void on_treeView_2_customContextMenuRequested(const QPoint &pos);

private:
    Ui::MainWindow *ui;
public:
    int r;
    int e;
    QFileSystemModel *model1;
    QFileSystemModel *model2;
    QMessageBox msg;
    QStringList path;
    QStringList path2;
    QStringListModel stringmodel;
    QStringListModel stringmodel2;
    QMenu *menu;
    QAction *kopirov;
    QAction *udalit;
    QAction *vyrezat;
    QAction *vstavit;
    QAction *pereim;
    QAction *sozd;
    QAction *prosmotr;
};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    model1=new QFileSystemModel();
    model2=new QFileSystemModel();
    model1->setRootPath(QDir::currentPath());
    model1->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDotAndDotDot);
    ui->treeView->setModel(model1);
    ui->treeView->hideColumn(2);
    ui->treeView->setAcceptDrops(true);
    ui->treeView->setDragEnabled(true);
    ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);


    model2->setRootPath(QDir::currentPath());
    model2->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDotAndDotDot);
    ui->treeView_2->setModel(model2);
    ui->treeView_2->hideColumn(2);
    ui->treeView_2->setAcceptDrops(true);
    ui->treeView_2->setDragEnabled(true);
    ui->treeView_2->setDragDropMode(QAbstractItemView::DragDrop);
    ui->treeView_2->setContextMenuPolicy(Qt::CustomContextMenu);

    menu=new QMenu;
    kopirov= new QAction(QString::fromLocal8Bit("Копировать"),this);
    vyrezat=new QAction(QString::fromLocal8Bit("Вырезать"),this);
    vstavit=new QAction(QString::fromLocal8Bit("Вставить"),this);
    udalit=new QAction(QString::fromLocal8Bit("Удалить"),this);
    pereim=new QAction(QString::fromLocal8Bit("Переименовать"),this);
    sozd=new QAction(QString::fromLocal8Bit("Создать"),this);
    //prosmotr=new QAction(QString::fromLocal8Bit("Просмотр"),this);
    menu->addAction(kopirov);
    menu->addAction(udalit);
    menu->addAction(vyrezat);
    menu->addAction(vstavit);
    menu->addAction(pereim);
    menu->addAction(sozd);
    //menu->addAction(prosmotr);
    vstavit->setVisible(false);
}

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

void MainWindow::on_treeView_clicked(const QModelIndex &index)
{

    bool q=model1->isDir(index);   // В случае если объект папка
    if (q)
    {
         //int i;
         QString str=model1->fileInfo(index).absoluteFilePath();  // взятие абсолютного пути
         if (!path.contains(str))     // в случае если путь не содержитьсся в списке
         {
            path<<str;    // то добавляем его
         }
         else
         {
             for (int i=0;i<path.size();i++)
             {
                 if (path==str)
                 {
                     path.removeAt(i);
                 }
             }
         }
         r=path.size();     // определения количества элементов в списке
         stringmodel.setStringList(path);
         ui->listView->setModel(&stringmodel);

     }
}

void MainWindow::on_treeView_2_clicked(const QModelIndex &index)
{
    bool q=model2->isDir(index);   // В случае если объект папка
    if (q)
    {

         QString str=model2->fileInfo(index).absoluteFilePath();  // взятие абсолютного пути
         if (!path2.contains(str))     // в случае если путь не содержитьсся в списке
         {
            path2<<str;    // то добавляем его
         }
         else
         {
             for (int i=0;i<path2.size();i++)
             {
                 if (path2==str)
                 {
                     path2.removeAt(i);
                 }
             }
         }
         e=path2.size();     // определения количества элементов в списке
         stringmodel2.setStringList(path2);
         ui->listView_2->setModel(&stringmodel2);


     }
}

void MainWindow::on_treeView_customContextMenuRequested(const QPoint &pos)
{

    menu->exec(QCursor::pos());



    //path.clear();
}

void MainWindow::on_treeView_2_customContextMenuRequested(const QPoint &pos)
{

    menu->exec(QCursor::pos());
    //path2.clear();
}

Так вот проблема в следующем. Когда я нажимаю по дереву каталогов файловой системы левой кнопкой мыши(выделяю)его то полный путь папки заносится в strimglist model и отображается в qlistview. В случае повторного нажатия по этому же каталогу он как бы удаляется из списка. Те пользователь выделил папку - значит как бы хочет что нибудь с ней сделать, если снял выделение(повторно нажал) значит не хочет. Но проблема в том когда я нажимаю правой кнопкой мыши то выделение снимается при вызове контекстного меню.... Так вот как сделать так чтоб выделение не снималось конкретно при нажатии пкм(при вызове контекстного меню)?
(http://s019.radikal.ru/i643/1405/59/2f1fb15bfdc0.png) (http://www.radikal.ru)
(http://s020.radikal.ru/i721/1405/8b/addaefa2a93f.png) (http://www.radikal.ru)


Название: Re: Событие при клике на модель файлов
Отправлено: carrygun от Май 05, 2014, 04:37
Я бы наследовался от QTreeView, перекрывал бы там метод клика мышью и бросал бы свой сигнал, в зависимости от кнопки мыши.