Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: переопределение mouse press event
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
koldun90
Здравствуйте уважаемые форумчане. Для моей задачи файлового менеджера мне нужно переопределить mouse press event.
вот собственно код файла менеджера (но это только пока)
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "mytreeview.h"
#include <QMainWindow>
#include <QFileSystemModel>
#include <QMessageBox>
#include <QString>
#include <QStringListModel>
#include <QMouseEvent>
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;
    QString str;
    mytreeview tt;
};
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;
         str=model1->fileInfo(index).absoluteFilePath();  // взятие абсолютного пути
         if (!path.contains(str))     // в случае если путь не содержитьсся в списке
         {
            path<<str;    // то добавляем его
         }
         else
         {
             for (int i=0;i<path.size();i++)
             {
                 if (path[i]==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[i]==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<<str;



    //path.clear();
}

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

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



Нажмите для просмотра прикрепленного файла
Соответственно проблема заключалась в следующем: При выборе элементов в менеджере левой кнопкой мыши они соответственно выбираются заносятся в стринглист модель и отображаются в лист виев. Если нажать на туже папку то папка из списка исчезнет. При нажатии правой кнопки мыши у меня выскакивает контексное меню
но проблема в том что когда я выбрал допустим несколько папок лкм затем нажал правую кнопку мыши у меня вылезло меню, НО элемент у меня как бы удалился. Таким образом мне нужно как бы сделать точнее изменить mouse presss event. Чтоб события по разному обрабатывались на пкм и лкм.
так вот создал я класс и наследовался от qtreeview класс mytreeview и добавил соответственно в свой проект
mytreeviev.h
#ifndef MYTREEVIEW_H
#define MYTREEVIEW_H
#include <QTreeView>
#include <QMessageBox>
#include <QMouseEvent>
class mytreeview : public QTreeView
{
public:
    mytreeview();
protected:
    void mousePressEvent( QMouseEvent * event );


public:
    QMessageBox msg;

};

#endif // MYTREEVIEW_H
mytreeview.cpp
#include "mytreeview.h"

mytreeview::mytreeview()
{
}
void mytreeview::mousePressEvent(QMouseEvent *event)
{

    if (event->button() == Qt::RightButton) {
        // здесь обрабатываем левую кнопку мыши
        msg.setText("pravay");
        msg.exec();
    }
    else
    {
        // передаём остальные кнопки в базовый класс
        QTreeView::mousePressEvent(event);
    }
}
вот добавил я этот класс в проект
а как мне использовать переопределенный mouse press event?
Алексей1153
вопрос задан отвратительно, вряд ли кто станет вникать в проблему
igor_bogomolov
koldun90, архив битый, посмотреть не получилось.
Текста написано много, а суть не очень ясна.
Так, на вскидку, проблема может быть в том, что mousePressEvent нужно ловить не для QTreeView, а для его viewport.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.