写在前面:
这部分主要对于其他几个成员函数的理解。
主要内容:
void Screenshot::newScreenshot()
{
if (hideThisWindowCheckBox->isChecked())
hide();
newScreenshotButton->setDisabled(true);//当前的这个按钮被阻塞 不能再次按下
QTimer::singleShot(delaySpinBox->value() * 1000, this, &Screenshot::shootScreen);//在给定的延迟时间间隔之后调用截图的槽函数
}
resizeEvent()函数被重新实现以接收调度到窗口小部件的resize事件。 其目的是在不改变内容的情况下缩放预览的截图像素图,并确保应用程序可以顺利调整大小。
为了实现第一个目标,我们使用Qt :: KeepAspectRatio(保持宽长比)来缩放截图像素图。 我们将像素图缩放到屏幕截图预览标签的当前大小内尽可能大的一个矩形,以保持纵横比。 这意味着如果用户只在一个方向调整应用程序窗口,则预览截图保持相同的大小。
为了实现我们的第二个目标,我们确保预览屏幕截图仅在实际更改大小时才重新绘制(使用专用的updateScreenshotLabel()函数)。
QSize
The QSize class defines the size of a two-dimensional object using integer point precision.
QSize类使用整数点精度定义二维对象的大小。
大小由width() 和 height()指定。
它可以在构造函数中设置,并使用setWidth(),setHeight()或scale()函数或使用算术运算符进行更改。
通过使用rwidth()和rheight()函数检索对宽度和高度的引用,也可以直接操纵大小。
最后,可以使用transpose()函数交换宽度和高度。
isValid()函数确定大小是否有效(有效大小的宽度和高度都大于或等于零)。如果width和height中的任何一个小于或等于零,则isEmpty()函数返回true,而isNull()函数仅在宽度和高度都为零时才返回true。
使用expandedTo()函数来检索包含此大小和给定大小的最大高度和宽度的大小。类似地,boundedTo()函数返回一个尺寸,它保存了这个尺寸和给定尺寸的最小高度和宽度。
QSize对象可以流式传输以及比较。
QLabel
小部件提供文本或图像显示。
QSize size() const
const QPixmap *pixmap() const
setDisabled
Disables widget input events if disable is true; otherwise enables input events.
newScreenshotButton->setDisabled(true);
当前的组件的输入事件被阻塞
QTimer::singleShot
[static] void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
这个成员函数的作用就是在给定的时间间隔之后调用一个槽函数
使用这个函数是非常方便的,因为你不需要为一个timerEvent或创建一个本地的QTimer对象而烦恼。
整个这个newScreenshot函数,做的工作就是如果隐藏窗口的选项被选择了,那么就将窗口隐藏,然后让当前的新建截图的按钮阻塞,并且在给定的延迟时间间隔之后调用shootScreen这个槽函数。
几个问题
newScreenshotButton->setDisabled(true);
这被置为true之后什么时候会还原
void Screenshot::saveScreenshot()
{
const QString format = "png";
QString initialPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
if (initialPath.isEmpty())
initialPath = QDir::currentPath();
initialPath += tr("/untitled.") + format;
QFileDialog fileDialog(this, tr("Save As"), initialPath);
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setDirectory(initialPath);
QStringList mimeTypes;
foreach (const QByteArray &bf, QImageWriter::supportedMimeTypes())
mimeTypes.append(QLatin1String(bf));
fileDialog.setMimeTypeFilters(mimeTypes);
fileDialog.selectMimeTypeFilter("image/" + format);
fileDialog.setDefaultSuffix(format);
if (fileDialog.exec() != QDialog::Accepted)
return;
const QString fileName = fileDialog.selectedFiles().first();
if (!originalPixmap.save(fileName)) {
QMessageBox::warning(this, tr("Save Error"), tr("The image could not be saved to \"%1\".")
.arg(QDir::toNativeSeparators(fileName)));
}
}
QStandardPaths
QString initialPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
这个类提供获取标准路径的方法。
该类包含查询本地文件系统上的标准位置的函数,用于常见任务,例如用户特定的目录或系统范围的配置目录。
这里用到的成员函数:
[static] QString QStandardPaths::writableLocation(StandardLocation type)
作用:返回type类型的文件将被写入的目录地址,或者返回一个空的字符串当无法确定位置的时候。
这个类里定义了一些类型 :
enum LocateOption { LocateFile, LocateDirectory }
flags LocateOptions
enum StandardLocation { DesktopLocation, DocumentsLocation, FontsLocation, ApplicationsLocation, ..., AppConfigLocation }
这里用到了enum QStandardPaths::StandardLocation
这个枚举描述了可以使用方法查询的不同位置 可以被很多的查询方法使用
QStandardPaths::PicturesLocation
返回包含用户照片或照片的目录。 这是一个普通的价值。 如果没有特定于图片文件的目录,则返回用于存储用户文档的合理回退。
QFileDialog Class
这个类继承于QDialog 也就是说这个类其实也是一种对话框
给用户提供一个可以选择文件和目录的对话框。
这里使用了下面这个带参数的构造函数
QFileDialog::QFileDialog(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString())
使用给定的父对象和标题构造一个文件对话框,该对话框最初显示指定目录的内容。 在对话框中显示目录的内容之前,使用filter指定的由分号分隔的过滤器列表进行过滤。
这个类有这样一个属性
acceptMode : AcceptMode
这个属性描述这个对话框接受的模式 默认的模式是AcceptOpen.只接受打开文件
还有一个模式是AcceptSave 只接受保存文件
这两个变量定义在enum QFileDialog::AcceptMode
另一个用到的属性为:
fileMode : FileMode
这个属性描述当前对话框可以处理的文件的类型
这个模式定义了用户可以在对话框里选择的元素的类型和数量 默认状态设置的是 AnyFile
此枚举用于指示用户可以在文件对话框中选择的内容; 即如果用户点击OK,对话框将返回什么。
AnyFile 返回的是文件的名字不论文件是否存在
QImageWriter Class
QImageWriter类提供了一个独立于格式的接口,用于将图像写入文件或其他设备。
该类有一个静态成员变函数
QList< QByteArray> supportedMimeTypes()
这个函数返回支持QImageWriter的MIME列表
这个函数调用之前QApplication的实例化对象必须被创建。
MIME
(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
也就是支持的文件格式
Qt支持的图片的文件格式:
void QFileDialog::setMimeTypeFilters(const QStringList &filters)
通过给定的MIMEtypes去设定当前的文件对话框的过滤器的选项
比如下面代码
QStringList temp; temp.append("image/png");
fileDialog.setMimeTypeFilters(temp);
就形成了
void QFileDialog::selectMimeTypeFilter(const QString &filter)
设置当前MIMEtype过滤器显示的是哪个类型 也就是初始的状态
这里初始是png类型
QByteArray Class
这个类提供字节数组
QByteArray可以用来存储原始字节(包括’\ 0’)和传统的8位’\ 0’终止的字符串。 使用QByteArray比使用const char *方便得多。 在幕后,它始终确保数据后面跟着一个’\ 0’终止符,并使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。
defaultSuffix : QString
如果没有指定其他后缀,则此属性包含添加到文件名的后缀。
这个属性指定了一个字符串,如果它没有后缀,它将被添加到文件名中。 后缀通常用于表示文件类型(例如,“txt”表示文本文件)。
[virtual slot] int QDialog::exec()
将对话框显示为模式对话框,直到用户关闭为止。 该函数返回一个DialogCode结果。
如果该对话框是应用程序模式,则在关闭对话框之前,用户不能与同一应用程序中的任何其他窗口进行交互。 如果对话框是窗口模式,则只有在打开对话框时才阻止与父窗口的交互。 默认情况下,该对话框是应用程序模式。
这就是为啥 出现这种对话框的时候 不能对其他的窗口操作
QStringList QFileDialog::selectedFiles() const
返回包含所选择的文件的绝对路径的字符串列表
QStringList Class
这个类提供字符串列表
T &QList::first()
返回列表第一个元素的引用
bool QPixmap::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) const
使用指定的图像文件格式和品质因数,将像素图保存到具有给定fileName的文件中。
品质因数必须在[0,100]或-1的范围内。 指定0可以获得较小的压缩文件,对于较大的未压缩文件可以指定100,使用默认设置则指定-1。如果格式为0,则将从fileName的后缀中选择图像格式。
bool返回值表示成功还是失败
saveScreenshot()整个这个函数就是完成保存文件跳出的QFileDialog的初始化和保存文件的工作