QTreeView幻灯片多选后无法使用单击选择

QTreeView Cannot use single click selection after slide multi selection

本文关键字:单击 选择 幻灯片 QTreeView      更新时间:2023-10-16

我正在编写一个GUI,它将使用Qt在c++中的触摸屏设备上运行;我有一个QTreeView,它使用QFileSystemModel显示一些图像;我有一个FileFrame类和MyTreeView(继承

QTreeView当我启动应用程序时,我可以一键选择和取消选择多个文件,效果很好,每次释放鼠标(手指(时,程序都会打印文件信息!但是,如果我尝试用手指滑动选择文件,这是第一次工作,然后不可能完全取消选择开始文件,或者单击其他文件来选择/取消选择。

我不明白为什么使用手势会覆盖单击选择功能。我已启用";多重选择";在MyTreeView ui设计器属性中。

编辑:我找到了一个简单的解决方法,用幻灯片禁用多选:

-在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);
}

我有解决方案!我已经更好地阅读了这里的文档,发现你必须调用父方法来进行补码处理(我想在鼠标释放时做一个额外的任务,而不是完全覆盖它(;

所以我只是在方法的末尾加了一行,一切都很好!

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

我真可耻!