Я пишу 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);
}