OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2490|回复: 0

《I.MX6U 嵌入式Qt开发指南》第七章 Qt控件 7.4 显示窗口部件之浏览器

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2022-7-27 15:13:10 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2022-7-27 15:12 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335




第七章 Qt控件


7.4 显示窗口部件之浏览器

7.4.1 QTextBrowser
7.4.1.1 控件简介
      QTextBrowser继承QTextEdit,QTextBrowser类提供了一个具有超文本导航的文本浏览器。该类扩展了QTextEdit(在只读模式下),添加了一些导航功能,以便用户可以跟踪超文本文档中的链接。
7.4.1.2 用法示例
      例27_qtextbrowser,简单的文本浏览器(难度:简单),本例设计一个文本浏览器程序,可以打开并显示txt、html等文件。本小节还用到QAction,菜单栏,学习文件的打开以及处理等。
在新建例程默认继承QMainWindow类即可。勾选mainwindow.ui,因为我们要在工具栏里添加按钮来打开文件等操作。新建项目完成如下。
image130.jpg
file:///C:/Users/ALIENTEK/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg   在头文件“mainwindow.h”具体代码如下。
  1. mainwindow.h编程后的代码
  2. 1   #ifndef MAINWINDOW_H
  3. 2   #define MAINWINDOW_H
  4. 3
  5. 4   #include <QMainWindow>
  6. 5   #include <QTextBrowser>
  7. 6
  8. 7   QT_BEGIN_NAMESPACE
  9. 8   namespace Ui { class MainWindow; }
  10. 9   QT_END_NAMESPACE
  11. 10
  12. 11  class MainWindow : public QMainWindow
  13. 12  {
  14. 13      Q_OBJECT
  15. 14
  16. 15  public:
  17. 16      MainWindow(QWidget *parent = nullptr);
  18. 17      ~MainWindow();
  19. 18
  20. 19  private:
  21. 20      Ui::MainWindow *ui;
  22. 21      /* 声明对象 */
  23. 22      QTextBrowser *textBrowser;
  24. 23      QAction *openAction;
  25. 24
  26. 25  private slots:
  27. 26      /* 槽函数 */
  28. 27      void openActionTriggered();
  29. 28  };
  30. 29  #endif // MAINWINDOW_H
复制代码
在源文件“mainwindow.cpp”具体代码如下。
  1. mainwindow.cpp编程后的代码
  2. 1   #include "mainwindow.h"
  3. 2   #include "ui_mainwindow.h"
  4. 3   /* 窗口对话框与文本流 */
  5. 4   #include <QFileDialog>
  6. 5   #include <QTextStream>
  7. 6
  8. 7   MainWindow::MainWindow(QWidget *parent)
  9. 8       : QMainWindow(parent)
  10. 9       , ui(new Ui::MainWindow)
  11. 10  {
  12. 11      ui->setupUi(this);
  13. 12      /* 设置主窗体位置与大小 */
  14. 13      this->setGeometry(0, 0, 800, 480);
  15. 14
  16. 15      /* 将窗口标题设置为文本浏览器 */
  17. 16      this->setWindowTitle("文本浏览器");
  18. 17
  19. 18      /* 实例化 */
  20. 19      textBrowser = new QTextBrowser(this);
  21. 20      /* 将文本浏览器窗口居中 */
  22. 21      this->setCentralWidget(textBrowser);
  23. 22
  24. 23      /* 实例化 */
  25. 24      openAction = new QAction("打开",this);
  26. 25      /* ui窗口自带有menubar(菜单栏)、mainToolbar(工具栏)与
  27. 26       * statusbar(状态栏)
  28. 27       * menuBar是ui生成工程就有的,所以可以在menubar里添加
  29. 28       * 我们的QActiont等,如果不需要menubar,可以在ui设计
  30. 29       * 窗口里,在右则对象里把menubar删除,再自己重新定义自己的
  31. 30       * 菜单栏
  32. 31       */
  33. 32      /* 将动作添加到菜单栏 */
  34. 33      ui->menubar->addAction(openAction);
  35. 34
  36. 35      /* 信号槽连接 */
  37. 36      connect(openAction, SIGNAL(triggered()),
  38. 37              this, SLOT(openActionTriggered()));
  39. 38
  40. 39  }
  41. 40
  42. 41  MainWindow::~MainWindow()
  43. 42  {
  44. 43      delete ui;
  45. 44  }
  46. 45
  47. 46  void MainWindow::openActionTriggered()
  48. 47  {
  49. 48      /* 调用系统打开文件窗口,过滤文件名 */
  50. 49      QString fileName = QFileDialog::getOpenFileName(
  51. 50                  this,tr("打开文件"),"",
  52. 51                  tr("Files(*.txt *.cpp *.h *.html *.htm)")
  53. 52                  );
  54. 53      QFile myFile(fileName);
  55. 54      /* 以只读、文本方式打开,若打开失败,则返回 */
  56. 55      if(!myFile.open(QIODevice::ReadOnly | QIODevice::Text))
  57. 56          return;
  58. 57
  59. 58      /* 用QTextStream对象接收 */
  60. 59      QTextStream in (&myFile);
  61. 60
  62. 61      /* 读取全部数据 */
  63. 62      QString myText = in.readAll();
  64. 63
  65. 64      /* 判断打开文件的后缀,如果是html格式的则设置文本浏览器为html格式 */
  66. 65      if(fileName.endsWith("html") || fileName.endsWith("htm")){
  67. 66          textBrowser->setHtml(myText);
  68. 67      } else {
  69. 68          textBrowser->setPlainText(myText);
  70. 69      }
  71. 70
  72. 71      /* ui窗口自带有statusbar(状态栏),设置打开的文件名 */
  73. 72      ui->statusbar->showMessage("文件名:" + fileName);
  74. 73  }
复制代码
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
  1. main.cpp编程后的代码
  2. 1   #include "mainwindow.h"
  3. 2
  4. 3   #include <QApplication>
  5. 4
  6. 5   int main(int argc, char *argv[])
  7. 6   {
  8. 7       QApplication a(argc, argv);
  9. 8       MainWindow w;
  10. 9       w.show();
  11. 10      return a.exec();
  12. 11  }
复制代码
7.4.1.3 运行效果
      程序编译运行的结果如下。在菜单栏点击打开后,系统默认是打开的最近打开的位置,选择任意一个可打开的文件,本次打开的是该工程中的mainwindow.cpp文件,结果如下图。根据上面的例子可自行拓展打造自己的文本浏览器,例如在菜单栏上加上关闭动作等,在工具栏还可以添加字体颜色,与及背景颜色,以及字体的放大与缩小等,可自行拓展。(备注:经测试Ubuntu16的Qt程序异常,看不到菜单栏,所以看不到“打开”这个按钮,Ubuntu18显示正常。)
image132.jpg
file:///C:/Users/ALIENTEK/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
7.4.2 QGraphicsView
小节前言:
      在这里主要是简单介绍QGraphicsView这种框架类的介绍与常用接口,实际上这种框架过于复杂,我们也不能在这一小节完全展现,下面就让我们快速去了解QGraphicsView图形视图框架类吧!

7.4.2.1 控件简介
      QGraphicsView继承QAbstractScrollArea。QGraphicsView是图形视图框架的一部分,它提供了基于图元的模型/视图编程。QGraphicsView在可滚动视图中可视化QGraphicsScene的内容。要创建带有几何项的场景,请参阅QGraphicsScene的文档。
      要可视化场景,首先构造一个QGraphicsView对象,将要可视化的场景的地址传递给QGraphicsView的构造函数。或者,可以调用setScene()在稍后设置场景。

7.4.2.2 用法示例
     例28_qgraphicsview,简单的图像浏览器(难度:简单),本例设计一个图像浏览器程序,在上一节一的基础上,将它改变为图像浏览器。
     在新建例程默认继承QMainWindow类即可。勾选mainwindow.ui,因为我们要在工具栏里添加按钮来打开文件等操作。新建项目完成如下。
image134.jpg
file:///C:/Users/ALIENTEK/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg   在头文件“mainwindow.h”具体代码如下。
  1. mainwindow.h编程后的代码
  2. 1   #ifndef MAINWINDOW_H
  3. 2   #define MAINWINDOW_H
  4. 3
  5. 4   #include <QMainWindow>
  6. 5   #include <QGraphicsView>
  7. 6
  8. 7   QT_BEGIN_NAMESPACE
  9. 8   namespace Ui { class MainWindow; }
  10. 9   QT_END_NAMESPACE
  11. 10
  12. 11  class MainWindow : public QMainWindow
  13. 12  {
  14. 13      Q_OBJECT
  15. 14
  16. 15  public:
  17. 16      MainWindow(QWidget *parent = nullptr);
  18. 17      ~MainWindow();
  19. 18
  20. 19  private:
  21. 20      Ui::MainWindow *ui;
  22. 21      /* 声明对象 */
  23. 22      QGraphicsView *graphicsView;
  24. 23      QGraphicsScene *graphicsScene;
  25. 24      QAction *openAction;
  26. 25
  27. 26  private slots:
  28. 27      /* 槽函数 */
  29. 28      void openActionTriggered();
  30. 29
  31. 30  };
  32. 31  #endif // MAINWINDOW_H
复制代码
在源文件“mainwindow.cpp”具体代码如下。
  1. mainwindow.cpp编程后的代码
  2. 1   #include "mainwindow.h"
  3. 2   #include "ui_mainwindow.h"
  4. 3   #include <QFileDialog>
  5. 4
  6. 5   MainWindow::MainWindow(QWidget *parent)
  7. 6       : QMainWindow(parent)
  8. 7       , ui(new Ui::MainWindow)
  9. 8   {
  10. 9       ui->setupUi(this);
  11. 10      /* 设置主窗体大小 */
  12. 11
  13. 12      this->setGeometry(0, 0, 800, 480);
  14. 13      /* 将窗口标题设置为图像浏览器 */
  15. 14      this->setWindowTitle("图像浏览器");
  16. 15
  17. 16      /* 实例化图形视图对象 */
  18. 17      graphicsView = new QGraphicsView(this);
  19. 18      /* 将图像浏览器窗口居中 */
  20. 19      this->setCentralWidget(graphicsView);
  21. 20
  22. 21      /* 实例化场景对象 */
  23. 22      graphicsScene = new QGraphicsScene(this);
  24. 23
  25. 24      /* 在QGraphicsView设置场景 */
  26. 25      graphicsView->setScene(graphicsScene);
  27. 26
  28. 27      /* 将动作添加到菜单栏 */
  29. 28      openAction = new QAction("打开",this);
  30. 29      ui->menubar->addAction(openAction);
  31. 30
  32. 31      /* 信号槽连接 */
  33. 32      connect(openAction, SIGNAL(triggered()),
  34. 33              this, SLOT(openActionTriggered()));
  35. 34  }
  36. 35
  37. 36  MainWindow::~MainWindow()
  38. 37  {
  39. 38      delete ui;
  40. 39  }
  41. 40
  42. 41  void MainWindow::openActionTriggered()
  43. 42  {
  44. 43      /*调用系统打开文件窗口,设置窗口标题为“打开文件”,过滤文件名*/
  45. 44      QString fileName = QFileDialog::getOpenFileName(
  46. 45                  this,tr("打开文件"), "",
  47. 46                  tr("Files(*.png *.jpg *.bmp)")
  48. 47                  );
  49. 48      /* 定义QPixmap对象,指向fileName */
  50. 49      QPixmap image(fileName);
  51. 50      /* 将image用scaled来重新设置长宽为graphicsView的长宽,
  52. 51       * 保持纵横比等
  53. 52       */
  54. 53
  55. 54      /* 假若用户没选择文件,则返回 */
  56. 55      if(image.isNull())
  57. 56          return;
  58. 57      image = image.scaled(graphicsView->width(),
  59. 58                            graphicsView->height(),
  60. 59                            Qt::KeepAspectRatio,
  61. 60                            Qt::FastTransformation
  62. 61                            );
  63. 62      /* 在添加场景内容前,先清除之前的场景内容 */
  64. 63      graphicsScene->clear();
  65. 64      /* 添加场景内容image */
  66. 65      graphicsScene->addPixmap(image);
  67. 66      /* ui窗口自带有statusBar(状态栏),设置打开的文件名 */
  68. 67      ui->statusbar->showMessage("文件名:" + fileName);
  69. 68  }
复制代码
在源文件“main.cpp”具体代码如下。由新建项目时生成,无改动。
  1. main.cpp编程后的代码
  2. 1   #include "mainwindow.h"
  3. 2
  4. 3   #include <QApplication>
  5. 4
  6. 5   int main(int argc, char *argv[])
  7. 6   {
  8. 7       QApplication a(argc, argv);
  9. 8       MainWindow w;
  10. 9       w.show();
  11. 10      return a.exec();
  12. 11  }
复制代码
7.4.2.3 运行效果
       程序编译运行的结果如下。菜单栏点击打开后,系统默认是打开的最近打开的位置,选择任意一个可打开的图片。(备注:本例所展示的图片已经放在工程目录下)。
image136.jpg

file:///C:/Users/ALIENTEK/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-8 16:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表