04 QT实现一个简单的看图程序

本文介绍了一个基于QDir类的应用实例,展示了如何利用QDir类来管理文件夹中的图片文件,包括读取指定类型的文件列表、切换查看不同的图片文件等。

QDir类用于管理目录的操作
QDir(const QString &path = QString())
//创建对象时,可以指定此对象是操作的目录的路径

QStringList entryList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const
//获取目录里的文件名,并过滤。 返回一个字符串数组的首地址
// QStringList其实就类模板QList<QString>

QString path() const
// 获取当前对象所操作的目录路径

main.cpp


#include <QApplication>
#include <QWidget>
#include <QPixmap>
#include <QDir>
#include <QDebug>
#include <QLabel>
#include <QKeyEvent>
#include <QResizeEvent>

class MyWin : public  QWidget {
private:
    QDir *dir; //指向操作目录的对象
    QStringList files; //存放文件名列表
    QLabel  *label; //用于显示图像
    int  num; //记录当前显示的是第几个文件
protected:
    void keyPressEvent(QKeyEvent *e); //捕捉按键事件
    void resizeEvent(QResizeEvent *event); //捕捉窗口大小发生改变的事件
public:
    MyWin(QString dir_path, QWidget *parent = NULL); //创建对象时需指定图像文件的路径
    ~MyWin();
};

MyWin::MyWin(QString dir_path, QWidget *parent) : QWidget(parent)
{
    label = new QLabel(this);
    dir = new QDir(dir_path);  // 创建目录对象,并指定操作的目录路径
    QStringList filters; //用于指定过滤文件类型

    filters << "*.jpg" << "*.bmp" << "*.png"; //指定只获取扩展名为这三种的图像文件名
    files = dir->entryList(filters, QDir::Files, QDir::Time); //获取目录里面的过虑后的文件名

    num = 0; //初始时,显示第0张图
    if (0 == files.size())  //如果获取文件的个数为0时不显示图像.
        return;

    label->resize(this->size()); //设置标签为窗口的大小
    label->setScaledContents(true); //缩放图像
    label->setPixmap(QPixmap(dir->path()+"/"+files[0])); //不要忘了操作符重载

}

MyWin::~MyWin()
{
    delete dir;
    delete label;
}

void MyWin::keyPressEvent(QKeyEvent *e)
{
    int n = num;

    if (0 == files.size())
        return;

    switch (e->key())
    {
    case Qt::Key_Left: //看前一张图像,如果到头,则改为从最后一张开始
        n--;
        if (n < 0)
            n = files.size()-1;
        break;

    case Qt::Key_Right: //看后一张图像,如果到最后,则改为从第一张重新开始
        n++;
        if (n >= files.size())
            n = 0;
        break;
    }

    if (n == num)
        return;
    num = n;
    label->setPixmap(QPixmap(dir->path()+"/"+files[n]));

}

void MyWin::resizeEvent(QResizeEvent *event)
{
    label->resize(event->size()); //标签大小随窗口大小改变而改变
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyWin win("/icons");
    MyWin win2("/disk3/allshares");

    win.show();
    win2.show();
    return a.exec();
}
### 开发 CAD 查图工具的关键要素 开发一个用于查看 CAD 图纸的工具是一个复杂的工程,涉及多个技术领域。以下是几个核心方面以及如何实现这些功能的技术细节。 #### 1. **基础框架的选择** 为了构建 CAD 查看器工具,可以选择基于开源库或者商业 SDK 来加速开发过程。例如,OpenCASCADE 是一个强大的开源几何建模库,支持复杂三维模型的操作[^1]。如果目标是二维图纸,则可以考虑更轻量级的解决方案。 对于 GUI 部分,推荐使用跨平台框架如 Qt 或者 .NET 的 WinForms/WPF 技术栈来设计界面。特别是针对 Windows 平台的应用程序,Win32 API 可以为特定需求提供底层支持[^2]。 #### 2. **文件解析能力** CAD 文件通常存储为专有格式(如 DWG/DXF)。要实现对这些文件的支持,需要集成第三方库或自行编写解析逻辑: - 使用 Teigha Viewer Library 提供全面兼容 AutoCAD 格式的读取与渲染服务; - 对于 DXF 这种相对简单的 ASCII 文本结构化数据源,可以直接通过脚本来加载并绘制基本图形实体; ```cpp #include <iostream> #include <fstream> void readDXF(const std::string& filename){ std::ifstream file(filename); if (!file.is_open()) { throw std::runtime_error("Could not open file"); } // Simple example to demonstrate reading lines from a dxf file. std::string line; while(std::getline(file, line)){ // Process each command according to the DXF specification... std::cout << line << "\n"; } } ``` 以上代码片段展示了如何初步处理 DXF 文件的内容. #### 3. **交互体验优化** 为了让用户体验更加流畅,在实际操作过程中还需要注意以下几个方面的改进措施: - 实现缩放平移等功能以便用户能够自由浏览大尺寸图纸的不同区域。 - 添加测量距离角度面积等实用工具辅助分析工作成果。 - 支持多种视图模式切换(正交投影/透视效果),满足不同场景下的观察习惯差异。 #### 4. **性能考量因素** 随着项目规模扩大,可能会遇到内存占用过高或者是响应速度变慢等问题。因此建议采取如下策略应对挑战: - 应用延迟加载机制只呈现当前可见范围内的对象而非一次性全部载入内存之中减少资源消耗。 - 借助 GPU 加速提升绘图效率尤其适用于包含大量细节数字模型场合下显得尤为重要。 --- ### 示例代码:简单窗口创建演示 下面给出一段利用 MFC 创建最基本对话框应用程序的例子作为参考起点之一: ```cpp // StdAfx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #endif // Modify the following defines if you have to target a platform prior to the ones specified below. // Refer to MSDN for the latest info on corresponding values for different platforms. #define WINVER _WIN32_WINNT_VISTA // Minimum required operating system version is Vista #define _WIN32_WINNT _WIN32_WINNT_VISTA // Same as above #define _WIN32_IE _WIN32_IE_IE80 // Minimum supported Internet Explorer version is IE8 #define _RICHEDIT_VER 400 // Use Rich Edit control verison 4.x #include <afxwin.h> // MFC core and standard components class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; CMyApp theApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CFrameWnd; m_pMainWnd->Create(NULL, _T("Simple Window")); m_pMainWnd->ShowWindow(SW_SHOWDEFAULT); UpdateWindow(); return TRUE; } ``` 此部分仅展示了一个非常基础的概念验证版本,并未涉及到具体业务逻辑实现细节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值