QTreeView Не может использовать выбор одним щелчком после выбора нескольких слайдов - PullRequest
0 голосов
/ 14 июля 2020

Я пишу GUI, который будет работать на устройстве с сенсорным экраном на C ++ с использованием Qt; У меня есть QTreeView , который отображает некоторые изображения, используя QFileSystemModel ; У меня есть класс FileFrame и MyTreeView (наследующий QTreeView ), которые обрабатывают событие отпускания мыши; Я перехватываю событие отпускания мыши, чтобы показать информацию о выбранном файле (вы можете выбрать все, что хотите, но когда вы отпустите мышь, я хочу получить информацию обо всем выбранном файле в этот момент).

Когда я запускаю приложение, я могу выбрать и отменить выбор нескольких файлов одним щелчком мыши, и оно отлично работает, каждый раз, когда мышь (палец) отпускает информацию о файле для печати программы! но если я попытаюсь выбрать файлы, проведя по ним пальцем, это сработает в первый раз, а затем невозможно полностью отменить выбор начального файла или выбрать / отменить выбор одним щелчком мыши для каждого другого файла.

Я не понять, почему использование жеста отменяет функцию выбора одним щелчком. Я включил «множественный выбор» в свойствах дизайнера пользовательского интерфейса MyTreeView.

РЕДАКТИРОВАТЬ: я нашел обходной путь, просто отключив множественный выбор с помощью слайда:

-capture в MyTreeView событие перемещения мыши

- принять и ничего не делать

Для моего приложения достаточно, но я хотел бы знать, в чем проблема!

FileFrame.h

class CFileFrame : public QWidget, public CPageBase
{
 Q_OBJECT
public:
explicit CFileFrame(QWidget *parent = 0, CImagePreview *preview = 
nullptr);
~CFileFrame();

void ApplyLanguage(type_enmLanguage lang);
void updateSelectedFileInfo(QModelIndexList selectedFile);

private slots:
void on_btn_Preview_clicked();
void on_btn_Back_clicked();

void on_treeView_doubleClicked(const QModelIndex &index);


private:
Ui::CFileFrame              *ui;
QFileSystemModel            *m_pFileSystemModel;
CImagePreview               *m_pImagePreviewFrame;
CItemDelegateTreeViewZoom   *m_pmyItemDelegate;
};

FileFrame конструктор:

CFileFrame::CFileFrame(QWidget *parent, CImagePreview *imagePreview) 
:
QWidget(parent),
ui(new Ui::CFileFrame)
{
ui->setupUi(this);

m_pImagePreviewFrame = imagePreview;
//Start from image directory in executable path
QString path = QCoreApplication::applicationDirPath();
path += "/";
path += "images/";

m_pFileSystemModel = new QFileSystemModel();

m_pFileSystemModel->setFilter(QDir::AllDirs | QDir::Files 
|QDir::NoDotAndDotDot);
m_pFileSystemModel->setRootPath(path);
m_pFileSystemModel->rootDirectory();

QStringList filter;
filter << "*.png";
filter << "*.jpg";
filter << "*.jpeg";

m_pFileSystemModel->setNameFilters(filter);

//Don't show filtered files
m_pFileSystemModel->setNameFilterDisables(false);

ui->treeView->setModel(m_pFileSystemModel);
ui->treeView->setRootIndex(m_pFileSystemModel->index(path));

//Item delegate for increase tree view icon
m_pmyItemDelegate = new CItemDelegateTreeViewZoom(this);
ui->treeView->setItemDelegate(m_pmyItemDelegate);

//    ui->treeView->setUniformRowHeights(true);
//Hide unnecessary columns
ui->treeView->hideColumn(1);
ui->treeView->hideColumn(2);
ui->treeView->hideColumn(3);
ui->treeView->hideColumn(4);
}

Метод FileFrame для вызова после завершения выбора:

void CFileFrame::updateSelectedFileInfo(QModelIndexList 
selectedFile)
{
if(selectedFile.length() == 1)
{
    //Get selected file's information
    QFileInfo selectedFileInfo = m_pFileSystemModel- 
  >fileInfo(selectedFile.at(0));
    //If selected file is a directory display it's path
    if(selectedFileInfo.isDir())
    {
        ui->lineEdit->setText(selectedFileInfo.absoluteFilePath());
    }
    //If is a file display is information
    else
    {
        QString tmp = "Size: ";
        float number = 0.0;
        float size = (float) selectedFileInfo.size();
        if( size < 1024*1024) //In KiloBytes
        {
            number = size / 1024;
            tmp += QString::number((double) number, 'f', 2);
            tmp += " Kb - Created: ";
        }
        else if(size < 1024*1024*1024) //MegaBytes
        {
            number = size / (1024*1024);
            tmp += QString::number((double) number, 'f', 2);
            tmp += " Mb - Created: ";
        }
        else //Gigabytes
        {
            number = size / (1024*1024*1024);
            tmp += QString::number((double) number, 'f', 2);
            tmp += " Gb - Created: ";

        }
        //Get time and date of creation
        tmp += selectedFileInfo.created().toString("d/m/yy hh:mm");
        tmp += " - Photo(yes)";
        ui->lineEdit->setText(tmp);
    }
}
//If is selected more than one
else if(selectedFile.length() >= 2)
{
    ui->lineEdit->setText("Multiple Selection");
}
else
{
    ui->lineEdit->setText("No File Selected");
}

}

MyTreeView.h:

class CMyTreeView : public QTreeView
{
public:
CMyTreeView(QWidget *parent);


private:
int     m_nStart;
int     m_nEnd;
CFileFrame      *m_pParent;




private slots:
//        void selectionChanged(const QItemSelection & selected, const 
QItemSelection & deselected);
    virtual void mouseReleaseEvent(QMouseEvent * event);
//          bool viewportEvent(QEvent *event);
};

MyTreeView Конструктор:

CMyTreeView::CMyTreeView(QWidget *parent):
QTreeView(parent)
{

m_pParent = (CFileFrame*) parent;

}

Метод MyTreeView:

void CMyTreeView::mouseReleaseEvent(QMouseEvent * event)
{

//DEBUG
qDebug("MOuse released");
////////////////////
event->accept();
QModelIndexList selectedFiles = this->selectionModel()- 
>selectedIndexes();
m_pParent->updateSelectedFileInfo(selectedFiles);
}

1 Ответ

0 голосов
/ 15 июля 2020

У меня есть решение! Я лучше прочитал документацию Здесь и обнаружил, что вам нужно вызвать родительский метод для обработки дополнения (я хотел выполнить дополнительную задачу при отпускании мыши, а не полностью ее переопределить);

Итак, я просто добавил строку в конце метода, и все работает нормально!

void CMyTreeView::mouseReleaseEvent(QMouseEvent * event)
{
event->accept();
QModelIndexList selectedFiles = this->selectionModel()->selectedIndexes();
m_pParent->updateSelectedFileInfo(selectedFiles);
QTreeView::mouseReleaseEvent(event);
}

Позор мне!

...