Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

news2024/9/27 9:29:02

目录

1 Display Widgets简介

2 如何使用Display Widgets部件

2.1 QTextBrowser组件-简单的文本浏览器

​2.2 QGraphicsView组件-简单的图像浏览器


Display Widgets将分为两篇文章介绍

文章1(Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件-CSDN博客):Label(标签)、Calendar Widget(日历)、LCD Number(液晶数字)、Progress Bar(进度条)、Horizontal Line(水平线)、Vertical Line(垂直线)、OpenGL Widget(开放式图形库工具)、QQuick Widget(嵌入式 QML 工具)

文章2(本文):Text Browser(文本浏览器)、Graphics View(图形视图)

1 Display Widgets简介

Qt Designer 显示窗口部件提供的面板中,提供了 10 种显示小部件。以下是Display Widgets 的介绍:

  1. Text Browser(文本浏览器):QTextBrowser 是用于显示富文本文档的控件。这个部件可以显示来自本地文件或网络的HTML文档,并且可以解析HTML链接。

  2. Graphics View(图形视图):QGraphicsView 是一个用于图形项(如线条、形状、图像等)交互的控件。它是基于场景(QGraphicsScene)和视图(QGraphicsView)框架的一部分,用于管理和显示复杂的图形界面。

2 如何使用Display Widgets部件

2.1 QTextBrowser组件-简单的文本浏览器

QTextBrowser 是 Qt 中用于显示富文本内容的组件,可以显示格式化的文本、图片和超链接等。

  • QTextBrowser 继承自 QTextEdit,用于显示富文本内容,支持 HTML 标记。
  • 可以显示静态文本、超链接、表格、图片等富文本内容。
  • 用户可以选择文本内容、复制文本内容和点击超链接。
  • 可以设置文本颜色、字体、对齐方式等样式。
  • 支持滚动条,可以滚动查看大段文本内容。

下面详细介绍一下QTextBrowser的全部功能设置和参数:

  • 设置文本内容。ui->textBrowser->setText("Hello, world!");

  • 设置 HTML 格式的文本内容。ui->textBrowser->setHtml("<b>Hello</b>, <i>world</i>!");

  • 设置文本颜色。ui->textBrowser->setTextColor(Qt::blue);

  • 设置文本字体。ui->textBrowser->setFont(QFont("Arial", 12));

  • 设置文本对齐方式。ui->textBrowser->setAlignment(Qt::AlignCenter);

  • 设置文本是否只读。ui->textBrowser->setReadOnly(true);

  • 获取当前文本内容。QString text = ui->textBrowser->toPlainText(); clear():清空文本内容。ui->textBrowser->clear();

  • 链接点击事件处理。connect(ui->textBrowser, &QTextBrowser::anchorClicked, this, &MyClass::onAnchorClicked);

  • 获取文本显示区域的视口。QWidget *viewport = ui->textBrowser->viewport();

本例设计一个文本浏览器程序,可以打开并显示 txt、 html 等文件。本小节还用到 QAction,菜单栏,学习文件的打开以及处理等。

(1)首先按照文章新建项目(Qt教程 — 1.3 如何创建Qt项目-CSDN博客)。

(2)在头文件“mainwindow.h”修改代码,具体代码如下。1)导入<QTextBrowser>文件 —> 2)声明一个QTextBrowser、QAction对象用于显示字符串和图像。完整代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextBrowser>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    // 声明对象
    QTextBrowser *textBrowser;
    QAction *openAction;
    
private slots:
    // 槽函数
    void openActionTriggered();
};
#endif // MAINWINDOW_H

(3)在文件“mainwindow.cpp”修改代码,具体代码如下。 1)设置主窗体的显示位置与大小,将窗口标题设置为文本浏览器。—>2)实例化QTextBrowser对象,将文本浏览器窗口居中。—>3)实例化QAction,将动作添加到菜单栏。—>4)信号槽连接。—>5)编写打开文件的槽函数。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>
#include <QTextStream>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置主窗体位置与大小
    this->setGeometry(0, 0, 800, 480);
    // 将窗口标题设置为文本浏览器 */
    this->setWindowTitle("文本浏览器");
    // 实例化 */
    textBrowser = new QTextBrowser(this);
    // 将文本浏览器窗口居中 */
    this->setCentralWidget(textBrowser);
    // 实例化 */
    openAction = new QAction("打开",this);
    // ui 窗口自带有 menubar(菜单栏)、 mainToolbar(工具栏)与statusbar(状态栏)

    // 将动作添加到菜单栏
    ui->menubar->addAction(openAction);
    // 信号槽连接
    connect(openAction, SIGNAL(triggered()), this, SLOT(openActionTriggered()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openActionTriggered()
{
    // 调用系统打开文件窗口,过滤文件名
    QString fileName = QFileDialog::getOpenFileName(
        this,tr("打开文件"),"",
        tr("Files(*.txt *.cpp *.h *.html *.htm)")
    );
    QFile myFile(fileName);
    // 以只读、文本方式打开,若打开失败,则返回
    if(!myFile.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    // 用 QTextStream 对象接收
    QTextStream in (&myFile);
    // 读取全部数据
    QString myText = in.readAll();
    // 判断打开文件的后缀,如果是 html 格式的则设置文本浏览器为 html 格式
    if(fileName.endsWith("html") || fileName.endsWith("htm")){
        textBrowser->setHtml(myText);
    } else {
        textBrowser->setPlainText(myText);
    }
    // ui 窗口自带有 statusbar(状态栏),设置打开的文件名
    ui->statusbar->showMessage("文件名: " + fileName);
}

(4)程序编译运行的结果如下。在菜单栏点击打开后,系统默认是打开的最近打开的位置,选择任意一个可打开的文件,本次打开的是该工程中的 mainwindow.h 文件,结果如下图。根据上面的例子可自行拓展打造自己的文本浏览器,例如在菜单栏上加上关闭动作等,在工具栏还可以添加字体颜色,与及背景颜色,以及字体的放大与缩小等,可自行拓展。 

​2.2 QGraphicsView组件-简单的图像浏览器

QGraphicsView是Qt中用于显示QGraphicsScene中图形项的组件。它提供了对图形场景中项的视图,并允许用户进行缩放、平移和交互操作。以下是QGraphicsView的一些常用功能和设置详解:

  • 显示场景内容QGraphicsView用于显示QGraphicsScene中的图形项,可以通过setScene()方法将场景设置到视图中。
  • 视图变换:缩放:可以通过scale()方法进行视图的缩放操作。平移:可以通过translate()方法进行视图的平移操作。旋转:可以通过rotate()方法进行视图的旋转操作。

  • 视图交互:鼠标拖拽:可以通过设置setDragMode()方法来启用或禁用鼠标拖拽功能。滚轮缩放:可以通过设置setTransformationAnchor()方法来指定缩放的中心点。

  • 背景设置:可以通过setBackgroundBrush()方法设置视图的背景颜色或背景画刷。

  • 边界设置:可以通过setSceneRect()方法设置视图的边界矩形,限制显示的区域。

  • 视图更新:可以通过update()方法手动更新视图内容。

  • 坐标转换:可以通过mapToScene()mapFromScene()等方法进行视图坐标和场景坐标之间的转换。

  • 视图大小策略:可以通过setResizeAnchor()setAlignment()等方法设置视图的大小策略和对齐方式。

  • 视图边框:可以通过setFrameShape()setFrameShadow()等方法设置视图的边框形状和阴影效果。

  • 视图渲染:可以通过setRenderHint()方法设置视图的渲染选项,如抗锯齿、平滑等。

本例设计一个图像浏览器程序,在上一节一的基础上,将它改变为图像浏览器。

(1)首先按照文章新建项目(Qt教程 — 1.3 如何创建Qt项目-CSDN博客)。

(2)在头文件“mainwindow.h”修改代码,具体代码如下。1)导入<QGraphicsView>文件 —> 2)声明 QGraphicsView,QGraphicsScene, QAction对象和槽函数。完整代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    // 声明对象
    QGraphicsView *graphicsView;
    QGraphicsScene *graphicsScene;
    QAction *openAction;

private slots:
    // 槽函数
    void openActionTriggered();

};
#endif // MAINWINDOW_H

(3)在文件“mainwindow.cpp”修改代码,具体代码如下。 1)设置主窗体的显示位置与大小,将窗口标题设置为图像浏览器。—>2)实例化QTextBrowser对象,将图像浏览器窗口居中。—>3)实例化QAction,将动作添加到菜单栏。—>4)信号槽连接。—>5)编写打开图像的槽函数。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /***** 1 *****/
    // 设置主窗体位置与大小
    this->setGeometry(0, 0, 800, 480);

    /***** 2 *****/
    // 将窗口标题设置为图像浏览器
    this->setWindowTitle("图像浏览器");
    // 实例化图形视图对象
    graphicsView = new QGraphicsView(this);
    // 将图像浏览器窗口居中
    this->setCentralWidget(graphicsView);
    // 实例化场景对象
    graphicsScene = new QGraphicsScene(this);
    // 在QGraphicsView 设置场景
    graphicsView->setScene(graphicsScene);
    // 将动作添加到菜单栏
    openAction = new QAction("打开",this);
    ui->menubar->addAction(openAction);
    // 信号槽连接
    connect(openAction, SIGNAL(triggered()), this, SLOT(openActionTriggered()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openActionTriggered()
{
    /*调用系统打开文件窗口,设置窗口标题为“打开文件”,过滤文件名*/
    QString fileName = QFileDialog::getOpenFileName(
        this,tr("打开文件"), "",
        tr("Files(*.png *.jpg *.bmp)")
    );

    // 定义 QPixmap 对象,指向 fileName
    QPixmap image(fileName);
    // 将 image 用 scaled 来重新设置长宽为 graphicsView 的长宽,保持纵横比等
    // 假若用户没选择文件,则返回
    if(image.isNull())
        return;
    image = image.scaled(graphicsView->width(),
                         graphicsView->height(),
                         Qt::KeepAspectRatio,
                         Qt::FastTransformation
                         );
        // 在添加场景内容前,先清除之前的场景内容
        graphicsScene->clear();
        // 添加场景内容 image
        graphicsScene->addPixmap(image);
        // ui 窗口自带有 statusBar(状态栏),设置打开的文件名
        ui->statusbar->showMessage("文件名: " + fileName);
}

(4) 程序编译运行的结果如下。菜单栏点击打开后,系统默认是打开的最近打开的位置,选择任意一个可打开的图片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1538926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis是纸老虎吗?(五)

最近看到这样一则消息《全球首位AI工程师诞生&#xff0c;“码农”未来会消失&#xff1f;》&#xff0c;文章提到百度董事长兼首席执行官李彦宏认为未来将不会存在“程序员”这种职业。行业大佬的这种说法&#xff0c;让我异常恐慌。难道程序员就这样被淘汰了&#xff1f;AI真…

YOLOv8 | 注意力机制 | ShuffleAttention注意力机制 提升检测精度

YOLOv8成功添加ShuffleAttention ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;http://t.csdnimg.cn/1Aqzu YOLOv8涨点专栏…

力扣236 二叉树的最近公共祖先 Java版本

文章目录 题目描述代码 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

PDF文件如何以数字进行批量重命名?以数字重命名的PDF文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件&#xff0c;如文档、报告、合同等。为了更高效地管理这些文件&#xff0c;一个有效的方式就是对它们进行批量命名。批量命名不仅能提高文件的组织性&#xff0c;还能节省大量时间。下面&#xff0c;我们将详细介绍…

【数据分析案列】--- 北京某平台二手房可视化数据分析

一、引言 本案列基于北京某平台的二手房数据&#xff0c;通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼&#xff08;至关重要&#xff09;&#xff0c;对房屋价格、面积、有无电梯等因素的可视化展示&#xff0c;我们可以深入了解北京二手房市场的特点…

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见&#xff1a; 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨&#xff0c;就可以用飞桨进行推理了。刚开始计划用ONNX推理&#xff0c;但是在算能云没有装上&#xff0c;所以最…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

服务器中了.[hpssupfast@mailfence.com].Elbie勒索病毒,数据还能恢复吗?

引言&#xff1a; .[hpssupfastmailfence.com].Elbie勒索病毒是一种网络攻击病毒&#xff0c;它会在感染用户的计算机系统中放置恶意软件&#xff0c;该软件会对用户的文件进行加密并要求支付赎金以解密文件。这种病毒通常通过网络钓鱼、木马植入等方式传播&#xff0c;利用用户…

【Ubuntu 22.04 LTS】安装vmware提示没有兼容的gcc

在ubuntu 22.04 上运行wmware时显示找不到兼容的gcc 这里要求的是12.3.0版本&#xff0c;我查看了自己的gcc版本是上面的11.4.0 在ask ubuntu上找到了解决方法 尝试了这一条 三条命令执行完成之后&#xff0c;再次运行vm&#xff0c;没有提示gcc的问题 点击install下载相应模…

Unity vision pro模拟器开发教程-附常见问题解决方案

前言 庄生晓梦迷蝴蝶&#xff0c;望帝春心托杜鹃 废话 去年苹果发布会上&#xff0c;推出了Vision Pro这一款XR产品。并且宣布Unity作为其主要合作伙伴&#xff0c;负责开发XR的开发产品。 这消息一出&#xff0c;当晚Unity的股价直接被熔断。产品发布之后&#xff0c;一直等…

深度强化学习(九)(改进策略梯度)

深度强化学习&#xff08;九&#xff09;&#xff08;改进策略梯度&#xff09; 一.带基线的策略梯度方法 Theorem: 设 b b b 是任意的函数, b b b与 A A A无关。把 b b b 作为动作价值函数 Q π ( S , A ) Q_\pi(S, A) Qπ​(S,A) 的基线, 对策略梯度没有影响: ∇ θ J …

实例:NX二次开发使用链表进行拉伸功能(链表相关功能练习)

一、概述 在进行批量操作时经常会利用链表进行存放相应特征的TAG值&#xff0c;以便后续操作&#xff0c;最常见的就是拉伸功能。这里我们以拉伸功能为例子进行说明。 二、常用链表相关函数 UF_MODL_create_list 创建一个链表&#xff0c;并返回链表的头指针。…

Codeforces Round #936 (Div. 2)B~D

1946B - Maximum Sum 可以想到&#xff0c;每次都将最大连续子序列放到该子序列的最后&#xff0c;也就是每一轮都能将最大连续子序列倍增一次填到数组中&#xff0c;最终求结果 // Problem: B. Maximum Sum // Contest: Codeforces - Codeforces Round 936 (Div. 2) // URL: …

【Flink】Flink 中的时间和窗口之窗口其他API的使用

1. 窗口的其他API简介 对于一个窗口算子而言&#xff0c;窗口分配器和窗口函数是必不可少的。除此之外&#xff0c;Flink 还提供了其他一些可选的 API&#xff0c;可以更加灵活地控制窗口行为。 1.1 触发器&#xff08;Trigger&#xff09; 触发器主要是用来控制窗口什么时候…

算法系列--动态规划--子序列(2)

&#x1f495;"你可以说我贱&#xff0c;但你不能说我的爱贱。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(2),包含了关于子序列问题中较难的几道题目(尤其是通过二维状…

uni-app打包证书android

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

springboot实现文件上传

SpringBoot默认静态资源访问方式 首先想到的就是可以通过SpringBoot通常访问静态资源的方式&#xff0c;当访问&#xff1a;项目根路径 / 静态文件名时&#xff0c;SpringBoot会依次去类路径下的四个静态资源目录下查找&#xff08;默认配置&#xff09;。 在资源文件resour…

极大提高工作效率的 Linux 命令

作为一名软件开发人员&#xff0c;掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS&#xff0c;你总会遇到需要使用 Linux 命令的场合。例如&#xff0c;大多数 Docker 镜像都基于 Linux 系统。要进行 DevOps 工作&#xff0c;你需要熟悉Linux&#xff0c;至少要…

Redis中的缓存穿透

缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;导致这些请求直接到了数据库上&#xff0c;对数据库造成了巨大的压力&#xff0c;可能造成数据库宕机。 常见的解决方案&#xff1a; 1&#xff09;缓存无效 key 如果缓存和数据库中都查不到某…