QT DAY4

一、对话框

消息对话框、字体对话框、颜色对话框、文件对话框

1.1消息对话框

主要分为这四类对话及一种NoIcon无图标对话

而对话框也分为两种实现方式,一种为基于属性分开初始化的方式,这种方式更灵活,更多元,需要对exec的返回值进行判断才能得知是点击哪个按钮,需要写出exec进入执行态

QMessageBox::QMessageBox(                           //有参构造函数名
    QMessageBox::Icon icon,                          //图标
    const QString &title,                             //对话框标题
    const QString &text,                              //对话框提示信息文本
    QMessageBox::StandardButtons buttons = NoButton,  //对话框提供的按钮
    QWidget *parent = nullptr)                        //父组件
 
参数1的介绍:是对话框提供的图标
 
内容                        值               描述
QMessageBox::NoIcon         0                没有任何图标的对话框
                              
                                    
QMessageBox::Question       4                带一个问号的对话框
        
            
QMessageBox::Information    1                带一个i符号图标的对话框
     
            
QMessageBox::Warning        2                带一个感叹号图标的对话框
         
            
QMessageBox::Critical       3                带一个叉号图标的对话框
        
            
 
参数4的介绍:对话框提供的按钮
 
Constant             Value        Description
           
            
QMessageBox::Ok     0x00000400    提供确定按钮
    
        
QMessageBox::Open   0x00002000    提供打开按钮
    
       
QMessageBox::Save   0x00000800    提供保存按钮
    
       
QMessageBox::Cancel 0x00400000    提供取消按钮
    
 
 举个例子:
   QMessageBox msgBox;
  msgBox.setText("The document has been modified.");
  msgBox.setInformativeText("Do you want to save your changes?");
  msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
  msgBox.setDefaultButton(QMessageBox::Save);
  int ret = msgBox.exec();
  
     switch (ret) {
    case QMessageBox::Save:
        // Save was clicked
        break;
    case QMessageBox::Discard:
        // Don't Save was clicked
        break;
    case QMessageBox::Cancel:
        // Cancel was clicked
        break;
    default:
        // should never be reached
        break;
  }

静态成员函数与之相比会更简洁,无需实例化对象,直接通过类名调用,提供了information(), question(), warning(),  critical()。无需使用exec,直接展示对话框,但与上一种方式相比也会更局限

[static] QMessageBox::StandardButton              //函数返回值类型,返回的是对话框上用户按下的按钮
    QMessageBox::warning(                         //函数名
        QWidget *parent,                          //父组件
        const QString &title,                     //对话框标题
        const QString &text,                       //对话框文本内容
        QMessageBox::StandardButtons buttons = Ok,  //提供的按钮
        QMessageBox::StandardButton defaultButton = NoButton)  //默认按钮
举个例子:
 int ret = QMessageBox::warning(this, tr("My Application"),
                                 tr("The document has been modified.\n"
                                    "Do you want to save your changes?"),
                                 QMessageBox::Save | QMessageBox::Discard
                                 | QMessageBox::Cancel,
                                 QMessageBox::Save);

 

目前对于登录框的完善已经基本完成

1.2 字体对话框(QFontDialog)、颜色对话框(QColorDialog)、文件对话框(QFileDialog)

字体对话框用来更改对话内字体大小,通过对ok值的判断将用户选中的字体格式导入选中字体

可使用setCurrentFont或者setFont来对选中区域或全部区域进行更改

[static] QFont                               //函数返回值类型,是用户选择的字体  该函数是一个静态成员函数
    QFontDialog::getFont(                     //函数名
        bool *ok,                             //返回用户是否选中字体
        const QFont &initial,                 //初始字体
        QWidget *parent = nullptr,             //父组件
        const QString &title = QString())      //对话框标题

颜色对话框与字体对话框相似,也是用来更改字体或字体背景颜色的

可以使用QColorDialog类中的静态成员函数getColor来调取颜色对话框

该函数返回用户选中的颜色,如果用户选择了取消,则返回一个非法的颜色,可以通过成员函数isValid来进行判断

[static] QColor                               //返回用户选中的颜色   该函数是一个静态成员函数
    QColorDialog::getColor(                      //函数名
        const QColor &initial = Qt::white,       //初始颜色
        QWidget *parent = nullptr,              //父组件
        const QString &title = QString())       //对话框标题

文件对话框,对于文件的操作分为读写,出了Open之外还有相似的Save类

 [static] QString                                //返回值类型是用户选中的文件的路径
        QFileDialog::getOpenFileName(              //函数名
            QWidget *parent = nullptr,                //父组件
            const QString &caption = QString(),     //对话框标题
            const QString &dir = QString(),          //起始路径
            const QString &filter = QString(),       //过滤器
            QString *selectedFilter = nullptr)     //默认选中的过滤器
    注意:该函数返回的是选中文件的路径
        过滤器如果有多个,中间使用两个分号隔开:"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
举个例子:
  QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                  "/home",
                                                  tr("Images (*.png *.xpm *.jpg)"));
文件相关操作
    1>    使用QFile类实例化一个对象,通过该对象可以操作整个文件,该类的构造函数需要给定文件的路径
    2>    可以使用exists函数判断文件是否存在,如果存在,则可以对文件进行相关操作
    3>    使用该类中的成员函数open函数,用于打开文件,打开时需要给定打开模式
    4>    可以使用read、readLine、readAll从文件中读取数据,使用write函数,将数据写入文件
    5>    使用成员函数close关闭文件
    6>    所需类:QFile
举个例子:
 //1、实例化一个文件对象
    QFile file(fileName);     //使用获取到的文件路径,实例化一个文件对象,后期对文件的操作都是基于该对象
 
    //2、判断文件是否存在
    if(!file.exists())
    {
        return;
    }
    //3、打开文件
    if(!file.open(QFile::ReadWrite))
    {
        return;
    }
 
    //4、读取文件中的内容
    QByteArray msg = file.readAll();
 
 
    //将内容展示到ui界面
    ui->textEdit->setText(msg);    
    //获取文本编辑器中的内容
    //ui->textEdit->toPlainText();
    //5、关闭文件
    file.close();

 

二、软件发布

1.配置环境变量,将两个bin文件配置到系统环境变量中

 

2.之后将程序release一次,并将准备发布的文件夹内的可执行文件放到一个新文件夹中

3.在当前文件夹下调用终端

4.使用windeployqt.exe .\可执行文件名.exe命令即可将文件发布

三、事件处理机制

1. 什么是事件?  (重点)
    事件是由窗口系统或者自身产生的,用以响应所发生的
各类事情,比如用户按下并释放了键盘或者鼠标、窗口因
暴露而需要重绘、定时器到时而应有所动作,等等
 
    从某种意义上讲,事件比信号更原始,甚至可以认为大多
数信号其实都是由事件产生的。比如一个下压式按钮首先
感受到的是鼠标事件,
    在进行必要的处理以产生按钮下沉
继而弹起的视觉效果之后,才会发射 clicked()信号
 
2. 如何处理事件?  (重点)
   myWnd(自定义类) -继承-> QWidget -继承-> QObject	
   1> 当事件发生时,首先被调用的是QObject类中的虚函数event(),
   其 QEvent型参数标识了具体的事件类型
   	bool QObject:: event (QEvent* e)
   	{
   		if (e == mouseEvent)
   		{
   			void QWidget::mousePressEvent (QMouseEvent* e)
   			void QWidget:: mouseReleaseEvent (QMouseEvent* e)
   		}
   		if(e == keyEvent){
   			void QWidget::keyPressEvent (QMouseEvent* e)
   			void QWidget:: keyReleaseEvent (QMouseEvent* e)
   		}
   	}
   2> 作为QObject类的子类, QWidget类覆盖了其基类中的
   event()虚函数,并根据具体事件调用具体事件处理函数
   	void QWidget::mousePressEvent (QMouseEvent* e)
   	void QWidget::mouseReleaseEvent (QMouseEvent* e)
   	void QWidget::keyPressEvent (QMouseEvent* e)
   	void QWidget:: keyReleaseEvent (QMouseEvent* e)
   	void QWidget::paintEvent (QPaintEvent* e):
   3> 而这些事件处理函数同样也是虚函数,也可以被 QWidget类
   的子类覆盖,以提供针对不同窗口部件类型的事件处理
 
   4> 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,
   而组件的实现者更关心覆盖哪些事件处理函数

事件处理函数的由来是有QObject类提供可改写的虚函数,而QWidget类覆盖了继承而来的虚函数,并提供了一批用于处理事件的时间处理函数(也是虚函数),这也意味着它们也可以被子类覆盖,根据不同情况重写时间处理函数。

QObject类 提供了那些可以重写的虚函数
	[virtual] bool QObject::event(QEvent *e) 
			// 参数:事件的类型
 
QWidgets类, 提供了那些可以重写的虚函数
	[override virtual protected] bool QWidget::event(QEvent *event)
	
	[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)
	[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event)
	[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
	[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
	[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
	[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
	[virtual protected] void QObject::timerEvent(QTimerEvent *event)
 
QPainter类 ---> 画家类
	 void SimpleExampleWidget::paintEvent(QPaintEvent *)
     {
         QPainter painter(this);
         painter.setPen(Qt::blue);
         painter.setFont(QFont("Arial", 30));
         painter.drawText(rect(), Qt::AlignCenter, "Qt");
     }

例如使用太阳左右移的示例便能看出

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    this -> setWindowTitle("WeiFeng Talking Room");
    this -> resize(831,840);
    //接收栏
    edit1 = new QTextEdit(this);
    edit1 -> resize(801,615);
    //edit1->setFixedHeight(30);
    edit1 -> move(15,15);

    //发送栏
    edit2 = new QTextEdit(this);
    edit2 -> resize(edit1 -> width(),165);
    edit2 -> move(edit1 -> x(),edit1 ->height()+45);
    //上传按键
    btn1 = new QPushButton("上传", this);
    btn1 -> resize(70,30);
    btn1 -> move(edit1 -> x() ,edit1->y() + edit1->height());
    connect(btn1,&QPushButton::clicked,this,&Form::on_openBtn_clicked);
    //下载按键
    btn2 = new QPushButton("下载", this);
    btn2 -> resize(btn1 -> size());
    btn2 -> move(btn1 ->x()+btn1 -> width() ,btn1 -> y());
    connect(btn2,&QPushButton::clicked,this,&Form::on_saveBtn_clicked);
    btn3 = new QPushButton("设置字体", this);
    btn3 -> resize(btn1 -> size());
    btn3 -> move(btn2 ->x()+btn2 -> width() ,btn1 -> y());
    connect(btn3,&QPushButton::clicked,this,&Form::on_fontBtn_clicked);
    btn4 = new QPushButton("设置颜色", this);
    btn4 -> resize(btn1 -> size());
    btn4 -> move(btn3 ->x()+btn3 -> width() ,btn1 -> y());
    connect(btn4,&QPushButton::clicked,this,&Form::on_colorBtn_clicked);
}

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

void Form::jump_slot(){
    this->show();
}



void Form::on_fontBtn_clicked()
{
    //调用QFontDialog类的静态成员函数,getFont函数来调取系统提供的字体对话框
    bool ok;//用于接受用户是否选选中的字体
    QFont f = QFontDialog::getFont(&ok,QFont("隶书",10,10,false),this,"选择字体");
    //将选中的字体进行使用
    if(ok){
        edit1 -> setCurrentFont(f);
    }else{
        QMessageBox::information(this,"提示 ","您取消了选择字符" );
    }
}

void Form::on_colorBtn_clicked()
{
    QColor c = QColorDialog :: getColor(QColor("pink"),this,"color");
    if(c.isValid()){
        edit1 -> setTextColor(c);
        //edit1 -> setTextBackgroundColor(c);
    }else{
        QMessageBox::information(this,"提示","您取消了选择颜色");
    }

}



void Form::on_openBtn_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this,"上传",
                                                  "F:\\Shanghai\\QT\\QTfile\\QT DAY3",
                                                  "Image File(*.png *jpg *bmp);;Text File(*.txt);;All(*.*)");
    if(fileName.isNull()){
        QMessageBox::information(this,"提示","已取消");

    }else{
        qDebug() << fileName;
        QFile file(fileName);
        if(!file.exists()){
            return;
        }else{}
        //以读写方式打开
        if(!file.open(QFile::ReadWrite)){
            return;
        }else{
            qDebug() << fileName;
            QFile file(fileName);
            if(!file.exists()){
                return;
            }else{}
            if(!file.open(QFile::ReadWrite)){
                return;
            }else{}
            edit2 ->clear();
            QFileInfo fileInfo(fileName);
            QString suffix = fileInfo.suffix();
            if (suffix == "txt") {
                QByteArray msg = file.readAll();
                edit1 ->setText(QString::fromLocal8Bit(msg));
            } else if (suffix == "png" || suffix == "jpg" || suffix == "bmp") {
                edit1->insertHtml(QString("<img src='%1' />").arg(fileName));
            }
        }
    }
}

void Form::on_saveBtn_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this, "下载",
                                                    "F:\\Shanghai\\QT\\QTfile\\QT DAY3",
                                                    "Image File(*.png *jpg *bmp);;Text File(*.txt);;All(*.*)");
    if (fileName.isNull()) {
        QMessageBox::information(this, "提示", "已取消");
        return;
    }

    QFile file(fileName);
    // 以只写方式打开文件,如果文件不存在,它会被创建。
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, "保存文件", "无法保存文件 " + fileName + ": " + file.errorString());
        return;
    }

    edit2 ->clear();
    qDebug() << fileName;
           QFileInfo fileInfo(fileName);
           QString suffix = fileInfo.suffix(); // 获取文件后缀

           if (suffix == "txt") {
               QFile file(fileName);
               if (!file.open(QFile::WriteOnly | QFile::Text)) {
                   return;
               }
               QTextStream out(&file);
               out <<edit1->toPlainText();
               file.close();
           } else if (suffix == "png" || suffix == "jpg" || suffix == "bmp") {
               QPixmap pixmap = this->grab();  // 抓取当前窗口的内容
               pixmap.save(fileName);  // 保存为图片
           } else {

           }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLPro Studio for Mac:强大的SQL开发和管理工具

SQLPro Studio for Mac是一款强大的Mac上使用的SQL开发和管理工具&#xff0c;它支持各种数据库&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;SQLite等。使用 SQLPro Studio&#xff0c;您可以轻松地连接和管理您的数据库&#xff0c;执行SQL查询和脚本&#xff0c…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

Windows安装Nginx及部署vue前端项目操作

先在nginx官网下载windows下安装的包&#xff0c;并解压&#xff0c;到ngnix目录下 双击nginx.exe,会有黑窗闪过。 用cmd命令窗口&#xff0c;cd 到nginx解压目录&#xff0c;./nginx启动。 在浏览器中访问http://localhost:80,出现以下界面说明启动成功(由于笔者电脑80端口被…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Nano编辑器安装使用指南

关于nano Nano编辑器是一个命令行文本编辑器&#xff0c;具有简单易用的界面和一些基本功能。 Nano小巧友好&#xff0c;提供许多额外的特性&#xff0c;例如交互式的查找和替换、定位到指定的行列、自动缩进、特性切换、国际化支持、文件名标记完成等。 Nano是为了代替闭源的…

【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动

目录 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 2.2 处理键盘事件完成圆形的移动 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 void Widget::on_saveBtn_clicked() {QString filename QFileDialog::getSaveFileName(this,&…

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…

堆的基本存储(Java 实例代码)

堆的基本存储 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。 二、适用说明 堆是利用完…

【防火墙】防火墙NAT Server的配置

Web举例&#xff1a;公网用户通过NAT Server访问内部服务器 介绍公网用户通过NAT Server访问内部服务器的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网Web服务器和FTP服务器能够对外提供服务&#xff0c;需要在FW上配置NAT Server功能。除了公网…

java八股文面试[多线程]——进程与线程的区别

定义 1、进程&#xff1a;进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位&#xff0c;也是基本的执行单元。是一个动态的概念&#xff0c;是一个活动的实体。它不只是程序的代码&#xff0c;还包括当前的活动。 进程结构…

RunnerGo:提升性能测试效率的强大利器

在现代软件开发中&#xff0c;性能测试是确保应用程序在真实负载下正常运行的关键环节。为了满足不断增长的用户需求和保证应用程序的性能稳定性&#xff0c;这里给大家介绍RunnerGo&#xff0c;这是一款功能强大、易于使用的性能测试平台&#xff0c;能够极大地提升性能测试的…

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …

9、Spring_事务管理

六、Spring 事务管理 1.Spring 事务简介 事务概述&#xff1a;保证数据库操作同时成功或者同时失败 Spring 事务的概述&#xff1a;在数据层保证数据库操作同时成功或者同时失败 2.转账案例分析 转账肯定有一个业务方法&#xff1a;给转出用户减钱&#xff0c;给转入用户加…

Linux枚举文件目录、获取文件属性

目录 1.枚举指定路径下的文件目录2.获取文件属性stat其他方式&#xff1a;Linux获取文件属性stat()、fstat()、lstat()函数实现stat属性代码 1.枚举指定路径下的文件目录 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.…

Python基础学习第六天:Python 数据类型

内置数据类型 在编程中&#xff0c;数据类型是一个重要的概念。 变量可以存储不同类型的数据&#xff0c;并且不同类型可以执行不同的操作。 在这些类别中&#xff0c;Python 默认拥有以下内置数据类型&#xff1a; 获取数据类型 您可以使用 type() 函数获取任何对象的数据…

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge

Linux中的进程、fork、进程状态、环境变量

1、进程 1.1 PCB 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为进程属性的集合。课本上称之为PCB&#xff08;process control block&#xff09;&#xff0c;Linux操作系统下的PCB是: task_struct 在Linux中描述进程的结构体叫做task_struct。task_s…

pxe网络装机

目录 PXE是什么&#xff1f; PXE的组件&#xff1a; 配置vsftpd关闭防火墙与selinux ​编辑配置tftp 准备pxelinx.0文件、引导文件、内核文件 ​编辑配置dhcp 创建default文件 创建新虚拟机等待安装&#xff08;交互式安装完毕&#xff09; 创建客户端验证&#xff08;…

Error encountered when performing Introspect database postgres schema

我在使用postgresql数据库的时候遇到了这两个异常: 并且查看不到数据库里的表信息 Error encountered when performing Introspect database postgres schema public (details): 错误: 字段 t.relhasoids 不存在 Error encountered when performing Introspect database pos…

沉浸式VR虚拟实景样板间降低了看房购房的难度

720 全景是一种以全景视角为特点的虚拟现实展示方式&#xff0c;它通过全景图像和虚拟现实技术&#xff0c;将用户带入一个仿佛置身其中的沉浸式体验中。720 全景可以应用于旅游、房地产、展览等多个领域&#xff0c;为用户提供更为直观、真实的体验。 在房地产领域&#xff0c…