QFileDialog:如何通过触摸屏输入选择多个文件
QFileDialog: How to select multiple files with touch-screen input?
在我们使用Qt 4并支持触摸输入的应用程序中,我们使用带有选项QFileDialog::DontUseNativeDialog
和QFileDialog::ExistingFiles
的QFileDialog
。第一个是必需的,因为我们设置了自己的样式表,而这不适用于本机对话框。第二个是用于选择多个文件,这是我们想要做的
问题是,在 我试图操作 我试图交换底层 目前,我能想到的唯一解决方案是编写一个全新的对话框,但我希望避免这种努力。QFileDialog
中无法通过触摸输入选择多个文件,因为我们没有可用的Shift或CTRLQFileDialog
,使其显示项目的复选框,但我失败了。QTreeView
和QListView
使用的QFileSystemModel
,但这破坏了模型和对话框之间的信号槽连接。我找不到修复它们的方法,因为它们深深地埋在对话的私人肠道里。QFileDialog
模型视图中添加复选框呢
由于我未能将复选框添加到项目视图中,我实现了一个"破解"的解决方案。它在对话框中添加了一个额外的可检查按钮,充当"ctrl"键。选中该按钮时,可以选择多个文件。这个解决方案有点难看,因为它依赖于了解对话框的内部,但它能完成任务。
这是标题的代码。。。
// file touchfiledialog.h
/*
Event filter that is used to add a shift modifier to left mouse button events.
This is used as a helper class for the TouchFileDialog
*/
class EventFilterCtrlModifier : public QObject
{
Q_OBJECT;
bool addCtrlModifier;
public:
EventFilterCtrlModifier( QObject* parent);
void setAddCtrlModifier(bool b);
protected:
virtual bool eventFilter( QObject* watched, QEvent* e);
};
/*
TouchDialog adds the possibility to select multiple files with touch input to the QFileDialog.
This is done by adding an extra button which can be used as control key replacement.
*/
class QTOOLS_API TouchFileDialog : public QFileDialog
{
Q_OBJECT
EventFilterCtrlModifier* listViewEventFilter;
EventFilterCtrlModifier* treeViewEventFilter;
bool initialized;
public:
TouchFileDialog( QWidget* parent);
protected:
virtual void showEvent( QShowEvent* e);
private slots:
void activateCtrlModifier(bool b);
private:
void initObjectsForMultipleFileSelection();
};
随着实施。。。
// file touchfiledialog.cpp
#include "touchfiledialog.h"
EventFilterCtrlModifier::EventFilterCtrlModifier(QObject* parent)
: QObject(parent)
, addCtrlModifier(false)
{
}
void EventFilterCtrlModifier::setAddCtrlModifier(bool b)
{
addCtrlModifier = b;
}
bool EventFilterCtrlModifier::eventFilter(QObject* watched, QEvent* e)
{
QEvent::Type type = e->type();
if( type == QEvent::MouseButtonPress || type == QEvent::MouseButtonRelease)
{
if( addCtrlModifier)
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(e);
// Create and post a new event with ctrl modifier if the event does not already have one.
if( !mouseEvent->modifiers().testFlag(Qt::ControlModifier))
{
QMouseEvent* newEventWithModifier = new QMouseEvent(
type,
mouseEvent->pos(),
mouseEvent->globalPos(),
mouseEvent->button(),
mouseEvent->buttons(),
mouseEvent->modifiers() | Qt::ControlModifier
);
QCoreApplication::postEvent(watched, newEventWithModifier);
return true; // absorb the original event
}
}
}
return false;
}
//#######################################################################################
TouchFileDialog::TouchFileDialog(QWidget* parent)
: QFileDialog(parent)
, listViewEventFilter(NULL)
, treeViewEventFilter(NULL)
, initialized(false)
{
}
void TouchFileDialog::showEvent(QShowEvent* e)
{
// install objects that are needed for multiple file selection if needed
if( !initialized)
{
if( fileMode() == QFileDialog::ExistingFiles)
{
initObjectsForMultipleFileSelection();
}
initialized = true;
}
QFileDialog::showEvent(e);
}
void TouchFileDialog::initObjectsForMultipleFileSelection()
{
// install event filter to item views that are used to add ctrl modifiers to mouse events
listViewEventFilter = new EventFilterCtrlModifier(this);
QListView* listView = findChild<QListView*>();
listView->viewport()->installEventFilter(listViewEventFilter);
treeViewEventFilter = new EventFilterCtrlModifier(this);
QTreeView* treeView = findChild<QTreeView*>();
treeView->viewport()->installEventFilter(treeViewEventFilter);
QGridLayout* dialogLayout = static_cast<QGridLayout*>(layout()); // Ugly because it makes assumptions about the internals of the QFileDialog
QPushButton* pushButtonSelectMultiple = new QPushButton(this);
pushButtonSelectMultiple->setText(tr("Select multiple"));
pushButtonSelectMultiple->setCheckable(true);
connect( pushButtonSelectMultiple, SIGNAL(toggled(bool)), this, SLOT(activateCtrlModifier(bool)));
dialogLayout->addWidget(pushButtonSelectMultiple, 2, 0);
}
void ZFFileDialog::activateCtrlModifier(bool b)
{
listViewEventFilter->setAddCtrlModifier(b);
treeViewEventFilter->setAddCtrlModifier(b);
}
TouchFileDialog
为项目视图安装一个事件过滤器,当选中对话框中的相应按钮时,该过滤器将为视图的鼠标事件添加一个ControlModifier。
请随意发布其他解决方案,因为这在某种程度上是即兴创作的。
相关文章:
- 选择文件对话框错误
- 如果在VC6中使用打开功能,如何选择文件夹?
- 在 Win32 应用中,如果未选择文件夹并且用户单击"确定",则文件夹选择对话框将关闭
- 使用柯南和cmake选择文件
- 如何选择文件保存到的位置?
- 使用dialog_fselect选择文件
- 如何判断 QFileDialog 是否已关闭而不选择文件
- C++选择文件夹,包括文件
- 生成文件 :从变量中按扩展名选择文件
- 在MFC VS2010中选择“文件”或“文件夹”
- 无法从OSX dylib显示OSX Finder选择文件对话框(QFileDialog::getOpenFileName
- 只选择文件夹,但也看到文件
- 如何在c++中编写一个选择文件夹对话框
- 使用CFileDialog选择文件时出现画图问题
- 预编译头-选择文件
- QFileDialog在关闭/析构时冻结(选择文件或取消)
- QSignalMapper在选择文件后不更新参数
- QT:在选择文件的目录上启动默认的资源管理器
- 如何根据要写入的数据类型动态选择文件句柄
- 正确选择文件流对象