Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4241640
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-07-29 16:06:28

工程代码: 1.rar  


书籍:《c++ gui qt4 编程》第九章 拖放 第一个例子


1. 使拖放生效

    拖放操作包括两个截然不同的动作: 拖动和放下。qt窗口部件可以作为拖动点、放下点或者同时作为拖动点和放下点。

     介绍了如何让一个qt应用程序接受由另一个应用程序执行的一个拖动操作。该qt应用程序时一个以QTextEdit作为中央窗口部件的主窗口程序。 当用户从桌面上或从资源管理器中拖动一个文本文件并且在这个应用程序上放下时,该应用程序就会将文本文件名 放到窗口中。

   自己增加的内容:
    将 我们要拖放的文件文本 中的内容 放置 到 QTextEdit 中
  1. /*******添加的打开文件,显示文件*****/
  2.         QFile file(fileName); //初始化
  3.         file.open(QFile::ReadOnly); //打开我们托放的文件
  4.         QByteArray data = file.readAll();
  5.        QTextCodec *codec = Qt::codecForHtml(data);
  6.         QString str = codec->toUnicode(data);
  7.         if (Qt::mightBeRichText(str)) {
  8.             textEdit->setHtml(str);
  9.         } else {
  10.          // str = QString::fromLocal8Bit(data);
  11.             textEdit->setPlainText(str);
  12.         }

主要的程序:

  1. #include "mainwindow.h"
  2. #include <QList>
  3. #include <QString>
  4. #include <QUrl>
  5. #include <QFile>
  6. #include <QByteArray>
  7. #include <QTextCodec>

  8. //在构造函数中,创建了一个QTextEdit并且把他设置为中央部件。默认情况下
  9. //QTextEdit可以接受来自其他应用程序文本的托放,并且如果用户在他上面放下一个
  10. //他将把这个文件的名称插入到文本中,由于托放事件是从子窗口部件传递到父窗口
  11. //部件的。所以通过禁用QTextEdit上的放下操作以及启动主窗口上的放下操作,就可以
  12. //在整个mainwindow窗口中获得放下事件
  13. MainWindow::MainWindow()
  14. {
  15.     textEdit = new QTextEdit;
  16.     setCentralWidget(textEdit); //设置中央窗口部件

  17.     textEdit->setAcceptDrops(false); //QTextEdit 子类中禁止托放
  18.     setAcceptDrops(true); //在父类 mainwindow中启动 托放功能

  19.     setWindowTitle(tr("Text Editor"));
  20. }

  21. //当用户把一个对象拖动到这个窗口部件上时,就会调用 dragEnterEvent ,如果
  22. //对这个事件调用acceptProposedAction,就表明用户可以在这个窗口上托放对象
  23. //默认情况下,窗口部件是不能接受拖动的。
  24. //如果我们希望用户拖动的只是文件,而非其他类型的东西,为了实现这一点,我们可以检查
  25. //拖动的MIME类型。MIME类型中的text/uri-list用于存储一系列的统一资源标志符
  26. //MIME类通常由剪贴板和托放系统使用,以识别不同类型的数据
  27. void MainWindow::dragEnterEvent(QDragEnterEvent *event)
  28. {
  29.     if(event->mimeData()->hasFormat("text/uri-list"));
  30.         event->acceptProposedAction();
  31. }

  32. //当用户在窗口部件上放下一个对象时,就会调用dropEvent。 我们调用QMimeData::urls
  33. //类获得QUrl列表。通常,用户一次只拖动一个文件,但是通过拖动一个选择区域来同时拖动
  34. //多个文件也是可能的。如果要托放的URL不止一个,或者要托放的URL不是一个本地文件名
  35. //则会返回到原调用处。
  36. //Qwidget 也提供了 dragMoveEvent 和 dragLeaveEvent 函数,但是在绝大数应用程序中
  37. //并不需要重新是些他们
  38. void MainWindow::dropEvent(QDropEvent *event)
  39. {
  40.     QList<QUrl> urls = event->mimeData()->urls();
  41.     if(urls.isEmpty())
  42.         return;

  43.     QString fileName = urls.first().toLocalFile();
  44.     if(fileName.isEmpty())
  45.         return;
  46.     if(readFile(fileName)) //假如托放成功,显示 文件名地址
  47.         setWindowTitle(tr("%1-%2").arg(fileName).arg(tr("Drag File")));
  48. /*******添加的打开文件,显示文件*****/
  49.         QFile file(fileName); //初始化
  50.         file.open(QFile::ReadOnly); //打开我们托放的文件
  51.         QByteArray data = file.readAll();
  52.        QTextCodec *codec = Qt::codecForHtml(data);
  53.         QString str = codec->toUnicode(data);
  54.         if (Qt::mightBeRichText(str)) {
  55.             textEdit->setHtml(str);
  56.         } else {
  57.          // str = QString::fromLocal8Bit(data);
  58.             textEdit->setPlainText(str);
  59.         }
  60.       // setCurrentFileName(f);

  61. }

  62. bool MainWindow::readFile(const QString &fileName)
  63. {
  64.     if(fileName.isEmpty())
  65.         return false;
  66.     else
  67.         return true;
  68. }








阅读(1260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~