【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
? ? ? ? 上位机软件很多时候需要把文件加载到窗口显示,或者是需要处理特定目录下的文件。这个时候,如果这些文件或者目录都写死,或者只是放在配置文件里面,不能动态设置的话,就会很麻烦。所以,这种情况下,我们一般会选择通过启动文件对话框或者目录对话框来解决。大部分gui平台都会提供这两个基础功能。今天,借着学习qt的机会,看看qt下面是怎么加载这两个对话框的。
? ? ? ? 和之前一样,创建一个基础的widget工程。
? ? ? ? 头文件部分,主要就是两个按钮。一个按钮单击后,会加载目录对话框;另外一个按钮单击后,会加载文件对话框。当然,除了这两个按钮之外,还需要添加两个按钮的关联函数。
#pragma once
#include <QtWidgets/QMainWindow>
#include <QPushButton>
#include <QDebug>
#include "ui_QtWidgetsApplication1.h"
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = nullptr);
~QtWidgetsApplication1();
private:
Ui::QtWidgetsApplication1Class ui;
private slots:
void choose_dir();
void choose_file();
private:
QPushButton *p_button1;
QPushButton *p_button2;
};
? ? ? ? 源文件部分的内容也不复杂。构造函数里面就是常规的按钮创建、位置设定。等按钮创建好了之后,把按钮和回调函数进行关联即可。当然,构造函数中,注意内存的释放。
#include <QFileDialog>
#include "QtWidgetsApplication1.h"
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// create button1
p_button1 = new QPushButton("choose dir", this);
p_button1->setGeometry(100, 100, 100, 30);
// create button2
p_button2 = new QPushButton("choose file", this);
p_button2->setGeometry(300, 100, 100, 30);
// connect function wiht its button
connect(p_button1, &QPushButton::clicked, this, &QtWidgetsApplication1::choose_dir);
connect(p_button2, &QPushButton::clicked, this, &QtWidgetsApplication1::choose_file);
}
QtWidgetsApplication1::~QtWidgetsApplication1()
{
delete p_button1;
delete p_button2;
}
? ? ? ? 接着我们来实现目录选择对话框。它使用的是QFileDialog的getExistingDirectory函数来实现的。如果最终用户放弃了选择,则会打印“User canceled selection”,反之则显示对应的目录地址。
void QtWidgetsApplication1::choose_dir()
{
// create directory dialog
QString directory = QFileDialog::getExistingDirectory(nullptr,
"Select a directory",
QDir::homePath(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
// if give up, directory will be empty
if (!directory.isEmpty()) {
qDebug() << "Selected directory: " << directory;
}
else {
qDebug() << "User canceled selection.";
}
}
? ? ? ?最后我们来实现的是文件选择对话框。它使用的是QFileDialog里面的getOpenFileName来实现的。和目录对话框一样,如果最终用户放弃选择,则会打印“User canceled selection”,反之则会显示对应文件的地址。
void QtWidgetsApplication1::choose_file()
{
// create file dialog
QString filePath = QFileDialog::getOpenFileName(nullptr,
"Open File",
QDir::homePath(),
"Text Files (*.txt);;All Files (*)");
// if give up, filePath will be empty
if (!filePath.isEmpty()) {
qDebug() << "Selected file: " << filePath;
}
else {
qDebug() << "User canceled selection.";
}
}
? ? ? ? 测试这部分,第一看编译是否正常,第二看功能是否ok。验证功能的时候,需要确认目录对话框和文件对话框是不是真的可以打开,另外各自正常选择和放弃选择的时候,在输出窗口中是否真的有相关的打印。如果这一切都没有问题,那就代表我们的编码是正确的,没有问题的。
? ? ? ? 目录选择框和文件选择框是软件开发中非常常见的功能,建议大家好好学习,多多使用。