我正在用 C(也在 C++ 中)实现一个程序来使用线程对文件进行排序,我需要在 C++ 或 C 中实现一个 GUI 来选择要排序的文件,而不通过输入标准指示路径(相当于 Java 中的 JFileChooser) . 你推荐什么教程?我正在阅读有关 Qt 的信息,但我对这个 IDE 不是很熟悉。如果你有任何例子会对我有很大帮助。
6 回答
使用 QT 非常简单:
void openFile()
{
QFileDialog::getOpenFileName( this, tr("Open Document"), QDir::currentPath(), tr("Document files (*.doc *.rtf);;All files (*.*)"), 0, QFileDialog::DontUseNativeDialog );
QString filename = QFileDialog::getOpenFileName(
this,
tr("Open Document"),
QDir::currentPath(),
tr("Document files (*.doc *.rtf);;All files (*.*)") );
if( !filename.isNull() )
{
qDebug( filename.toAscii() );
}
}
您不必为此使用带有主循环的完整 gui。windows 和 unix 提供显示所需文件对话框的函数调用。在 Windows 上,您将调用 GetOpenFileName 或 GetSaveFileName。如果你需要一种跨平台的方式来做这件事,试试 sourceforge 上的小文件对话框。
你有两个选择:
如果你想使用 QT,你应该使用QFileDialog并将Options标志设置为 QFileDialog::ShowDirsOnly。
如果您只想为 Windows 编写代码,您可以使用属于 Win32 的FolderBrowserDialog类。
还有 QFileSystemModel,它可以映射到 QTreeView 项目,并会通过其内部实现做很多你需要的事情。它是多线程的,允许排序并具有许多其他不错的功能。在此处查找文档
如果排序是您的程序唯一要做的事情,并且要在 unix-y 环境中使用,那么我建议将该程序制作为命令行工具并以某种脚本语言创建一个 GUI 包装器来调用该程序。它将更简单且更有用(您以半个工具的价格获得两个工具),它还将使其更容易移植到其他 GUI 环境以及更容易分发。
这个shellscript打开一个文件选择器对话框并运行你的程序(创造性地命名为yoursort)(未经测试,我不习惯编写shell脚本,我更喜欢其他脚本语言,我相信其他stackoverflow贡献者可以找到很多东西改进):
#!/bin/sh
FILE=`zenity --file-selection --title="Choose file to sort"`
if [ $? -eq 0 ]; then
yoursort -f "$FILE"
fi
Zenity是一个用于创建简单 GUI 对话框的命令行工具,它还包括一个进度对话框。
如果您想创建更高级的 GUI,请使用 tcl、Python 或 Ruby 等脚本语言。
Ruby GUI 工具包Shoes非常容易学习,它有一个基于流的布局引擎(有点像网页)。您可以使用 QT 完成大多数可以做的事情(这似乎是其他答案中最喜欢的),或者至少可以完成 99% 的应用程序所需的所有事情。由于 Shoes 是作为 GTK 上的层构建的,因此它与 GTK 一样可移植,并且您可以使用已经为您布置的大部分繁重工作来扩展它(即您不必直接处理 X 服务器、字体渲染或其他疲劳类似的东西)。
这篇文章的其余部分有点主题,但是由于有人因为我建议使用脚本语言而降级了我,我觉得我必须激励为什么用原始 C 或 C++ 编写 GUI 几乎总是一个坏主意(除非你这样做的唯一目的是学习如何做)。
使用原始 C 或 C++ 创建 GUI 适合喜欢钉钉子穿过身体的人,当您必须更改应用程序的外观或添加新功能时尤其痛苦。使用一些脚本语言,或者作为应用程序中的内置脚本语言 [tcl、lua、guile 和 pike 被设计为易于合并到您的应用程序中],或者围绕您创建的命令行工具创建一个 GUI 包装器。
还有很多 GUI 工具包(例如 GTK、QT)可以从某种 GUI 描述文件(如 XML 文件)加载 GUI:s。与编写和修改原始 C 或 C++ 相比,这些文件更容易编写和修改(或使用 GUI 构建器创建和修改)。
如果速度很重要并且作为最后的手段,请使用一些高级语言为您的 GUI 生成 C 或 C++ 代码,与编写原始代码相比,更改更灵活。但是如果你这样做,你仍然需要为第一个版本的 GUI 做大部分痛苦的工作,就像你用原始 C 或 C++ 编写它一样。TCL、M4 和 Ruby 等语言擅长这种元编程。另一个最后的手段是编写自己的 GUI 加载器,然后您可以使 GUI 描述文件的语法更加专业,这将使其比使用 GUI 工具包现成的 GUI 加载器更快(有时为 UI 小部件提供现成的 GUI loader 不支持),同样,这将使您更灵活地更改 GUI,然后用原始 C 或 C++ 对其进行编码。
PS。QT 使用预处理器来减轻 C++ 中 GUI 编程的痛苦,但它仍然非常低级,使用起来仍然没有必要的痛苦。