QTreeView幻灯片多选后无法使用单击选择
QTreeView Cannot use single click selection after slide multi selection
我正在编写一个GUI,它将使用Qt在c++中的触摸屏设备上运行;我有一个QTreeView,它使用QFileSystemModel显示一些图像;我有一个FileFrame类和MyTreeView(继承 QTreeView当我启动应用程序时,我可以一键选择和取消选择多个文件,效果很好,每次释放鼠标(手指(时,程序都会打印文件信息!但是,如果我尝试用手指滑动选择文件,这是第一次工作,然后不可能完全取消选择开始文件,或者单击其他文件来选择/取消选择。 我不明白为什么使用手势会覆盖单击选择功能。我已启用";多重选择";在MyTreeView ui设计器属性中。 编辑:我找到了一个简单的解决方法,用幻灯片禁用多选: -在MyTreeView中捕获鼠标移动事件 -接受它,什么也不做 对于我的应用程序已经足够了,但我想知道问题出在哪里! FileFrame.h FileFrame构造函数: 选择完成后要调用的FileFrame方法: } MyTreeView.h: MyTreeView构造函数: MyTreeView方法: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;
};
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);
}
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");
}
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);
};
CMyTreeView::CMyTreeView(QWidget *parent):
QTreeView(parent)
{
m_pParent = (CFileFrame*) parent;
}
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);
}
我真可耻!
- QTreeView幻灯片多选后无法使用单击选择
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- QML TableView 使用 QtQuick.Controls 2 单击行
- ImGui 在单击按钮后冻结
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- 如何在QSplashScreen中禁用鼠标单击
- 单击一个按钮后创建一个按钮
- C++鼠标单击时的屏幕截图不起作用
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 标签检测鼠标单击 c++
- 如何使用鼠标单击选择多个 QLabel 对象?
- 在 Win32 应用中,如果未选择文件夹并且用户单击"确定",则文件夹选择对话框将关闭
- 在 c++ winrt 导航视图中,如何找到选择/单击的导航项?
- 如何通过 CTRL+单击在 QTableWidget 中禁用多个项目选择
- QT/C++,OS X:退出应用程序时可选择隐藏(),以便应用程序继续运行,并在单击dock中的图标后再次显示
- 如何告知用户单击了文件名选择对话框中的取消
- 在gtk绘图区域中单击时选择绘制的线
- 如何通过鼠标单击在QGraphicsView中选择位置并添加项目
- 如何有选择地使QWidget接受鼠标单击的焦点