Qt之QFileDialog

打开文件对话框,限制选择文件只能在家目录选择文件
左侧目录栏只能放家目录,上侧下拉框禁止选择,左右前进后退按钮禁止,输入框禁止

Qt之QFileDialog_第1张图片

	void FileDialogDemo::SetChooseFileSlot()
	{
	    QFileDialog z_FileDialog(this, "选择文件", QDir::homePath());
	    connect(&z_FileDialog, &QFileDialog::directoryEntered, this, &FileDialogDemo::SetEnterDirectorySlot);
	
	    z_FileDialog.setOptions(QFileDialog::DontUseNativeDialog | QFileDialog::ReadOnly);
	    //QFileDialog::DontUseNativeDialog 设置为不使用本机文件对话框,下面的findChild才不会报错
	    z_FileDialog.findChild<QWidget*>("toParentButton")->setEnabled(false); /**< 上级按钮*/
	    z_FileDialog.findChild<QWidget*>("backButton")->setEnabled(false); /**< 后退按钮*/
	    z_FileDialog.findChild<QWidget*>("lookInCombo")->setEnabled(false); /**< 下拉框*/
	
	    /**< 下侧输入框*/
	    QLineEdit* child = z_FileDialog.findChild<QLineEdit*>(QString(), Qt::FindChildrenRecursively);
	    if (nullptr != child)
	    {
	        child->setEnabled(false);
	    }
	
	    /**< 设置左侧显示的目录*/
	    QList<QUrl> z_Urls;
	    z_Urls << QUrl::fromLocalFile(QDir::homePath());//fromLocalFile 将QString转换成QUrl
	    z_FileDialog.setSidebarUrls(z_Urls);
	
	    //操作模式,QFileDialog::AcceptOpen 打开 按钮名称显示open   QFileDialog::AcceptSave保存 按钮名称显示save
	    z_FileDialog.setAcceptMode(QFileDialog::AcceptOpen);
	
	    /**< 文件模式*/
	    z_FileDialog.setFileMode(QFileDialog::ExistingFiles);
	
	    /**< 关闭 取消操作*/
	    if(z_FileDialog.exec() == QDialog::Rejected) {
	        QMessageBox::warning(this, "警告", "没有选择文件!");
	        return;
	    }
	
	    /**< 得到文件路径*/
	    QString z_FilePath = z_FileDialog.selectedFiles().value(0);
	
	    if (z_FilePath.isEmpty() || z_FilePath.isNull()) {
	        QMessageBox::warning(this, "警告", "没有选择文件!");
	        return ;
	    }
	
	    this->ui->m_LeFilePath->setText(z_FilePath);
	}

	void FileDialogDemo::SetEnterDirectorySlot(const QString &directory)
	{
	    /**< 得到信号发送者对象*/
	    QFileDialog *z_FileDialog = (QFileDialog *)sender();
	
	    QString dir = QDir::fromNativeSeparators(directory); /**< 将路径转换为"/"拼接的路径  本人使用的是linux系统*/
	
	    /**< 路径不是家目录开头*/
	    if (!dir.startsWith(QDir::homePath())) {
	        z_FileDialog->setDirectory(QDir::homePath()); /**< 设置为家目录*/
	    }
	
	    z_FileDialog->findChild<QWidget*>("backButton")->setEnabled(false);
	}

setOption
QFileDialog::ShowDirsOnly 仅显示目录,默认是显示文件和目录
QFileDialog::DontResolveSymlinks 不在文件对话框中解析符号链接。默认情况下,符号链接被解析。
QFileDialog::DontConfirmOverwrite 如果选择了现有文件,则不要求确认。默认情况下,请求确认。
QFileDialog::DontUseNativeDialog 不使用本机文件对话框。
QFileDialog::ReadOnly 只读
QFileDialog::HideNameFilterDetails 指示是否隐藏文件名筛选器详细信息。

setFileMode
QFileDialog::AnyFile 保存文件,如果选中一个文件点击save,那么会提示是否要替换掉该文件
QFileDialog::ExistingFile 用于选择存在的文件
QFileDialog::Directory 用于选择目录,如果选择文件,那么按钮enable属性设置为false
QFileDialog::ExistingFiles 用于选择多个文件

findChild
查找参数objectName
Qt::FindDirectChildrenOnly 直接孩子,不查找孙子
Qt::FindChildrenRecursively 递归查找所有孩子

Qt之QFileDialog_第2张图片Qt之QFileDialog_第3张图片



说明,怎样限制QFileDialog控件不可使用的。
通过父对象,递归查找所有子对象控件,便可以得到objectName,设置enable为false即可

    //得到所有的objectName
    QList<QWidget*> z_List = z_FileDialog.findChildren<QWidget*>();
    for (int i = 0; i < z_List.count(); ++i)
    {
        if (nullptr != z_List.at(i))
        {
            qDebug() << z_List.at(i)->objectName();
        }
    }

你可能感兴趣的:(QT)