Название: Событие при клике на модель файлов Отправлено: 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, перекрывал бы там метод клика мышью и бросал бы свой сигнал, в зависимости от кнопки мыши.
|