QT中对话框界面的实现以及事件处理机制(核心机制)

news/2024/7/5 2:25:42

对话框

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

消息对话框

  • 消息对话框提供了一个模态的对话框,用来提示用户信息,或者询问用户问题并得到回答

基于属性版本的API

  • 使用该类调用构造函数,构造一个类对象
  • 调用成员函数exec进入执行态
  • 对用户点击的按钮进行进一步处理即可,通过对exec的返回值得到用户点击的按钮
QMessageBox::QMessageBox(                           //有参构造函数名
    QMessageBox::Icon icon,                          //图标
    const QString &title,                             //对话框标题
    const QString &text,                              //对话框提示信息文本
    QMessageBox::StandardButtons buttons = NoButton,  //对话框提供的按钮
    QWidget *parent = nullptr)                        //父组件

基于静态成员函数版本

  • 由于静态成员函数独立于类对象而存在,所以,无需实例化对象,直接通过类名进行调用
  • 静态成员函数版本提供四个,分别是information(),question(),warning(),critical()
  • 静态成员函数调用后,之间展示对话框,无需使用exec
  • 解析其中warning()
[static] QMessageBox::StandardButton              //函数返回值类型,返回的是对话框上用户按下的按钮
    QMessageBox::warning(                         //函数名
        QWidget *parent,                          //父组件
        const QString &title,                     //对话框标题
        const QString &text,                       //对话框文本内容
        QMessageBox::StandardButtons buttons = Ok,  //提供的按钮
        QMessageBox::StandardButton defaultButton = NoButton)  //默认按钮

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

字体对话框

   字体对话框,可以使用QFontDialog类提供的静态成员函数getFont来完成
当调用了该函数后,就会弹出一个字体选择框,该函数返回的是用户选择的字体
如果用户取消了选择,则参数1为假,如果用户选择了字体,则参数1的值为真
所需类:QFontDialog、QFont
[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())       //对话框标题

文件对话框

  文件对话框,可以通过QFileDialog类中的静态成员函数,来获取要打开的文件路径
[static] QString                                //返回值类型是用户选中的文件的路径
        QFileDialog::getOpenFileName(              //函数名
            QWidget *parent = nullptr,                //父组件
            const QString &caption = QString(),     //对话框标题
            const QString &dir = QString(),          //起始路径
            const QString &filter = QString(),       //过滤器
            QString *selectedFilter = nullptr)     //默认选中的过滤器

文件相关的操作

1>    使用QFile类实例化一个对象,通过该对象可以操作整个文件,该类的构造函数需要给定文件的路径
2>    可以使用exists函数判断文件是否存在,如果存在,则可以对文件进行相关操作
3>    使用该类中的成员函数open函数,用于打开文件,打开时需要给定打开模式
4>    可以使用read、readLine、readAll从文件中读取数据,使用write函数,将数据写入文件
5>    使用成员函数close关闭文件
6>    所需类:QFile

事件处理(核心机制)

事件处理简介

1. 什么是事件?  (重点)
事件是由窗口系统或者自身产生的,用以响应所发生的各类事情,比如用户按下并释放了键盘或者鼠标、窗口因暴露而需要重绘、定时器到时而应有所动作,等等

从某种意义上讲,事件比信号更原始,甚至可以认为大多数信号其实都是由事件产生的。比如一个下压式按钮首先感受到的是鼠标事件,在进行必要的处理以产生按钮下沉继而弹起的视觉效果之后,才会发射 clicked()信号


2.如何处理事件
1> 当事件发生时,首先被调用的是QObject类中的虚函数event()
2> 作为QObject类的子类, QWidget类覆盖了其基类中的event()虚函数,并根据具体事件调用具体事件处理函数
3> 而这些事件处理函数同样也是虚函数,也可以被 QWidget类的子类覆盖,以提供针对不同窗口部件类型的事件处理
4> 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,而组件的实现者更关心覆盖哪些事件处理函数

练习

完成键盘触发实践,上下左右移动
.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QKeyEvent> //键盘处理事件
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void keyPressEvent(QKeyEvent *event) override;   //键盘按下事件处理函数
    void keyReleaseEvent(QKeyEvent *event) override; //键盘抬起事件处理函数
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"

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

Widget::~Widget()
{
    delete ui;
}
//键盘按下事件处理函数的定义
void Widget::keyPressEvent(QKeyEvent *event)
{
    //qDebug()<<"键盘被按下了";
    switch (event->key()) {
    case 'W': //上移
    {
        if(ui->label->y() <= 0-ui->label->height())
        {
            ui->label->move(ui->label->x(),this->height());
        }
        ui->label->move(ui->label->x(),ui->label->y()-2);
    }
        break;
    case 'S': //下移
    {
        if(ui->label->y() >= this->height())
        {
            ui->label->move(ui->label->x(),0);
        }
        ui->label->move(ui->label->x(),ui->label->y()+2);
    }
        break;
    case 'A': //左移
    {
        if(ui->label->x() <= 0-ui->label->width())
        {
            ui->label->move(this->height(),ui->label->y());
        }
        ui->label->move(ui->label->x()-2,ui->label->y());
    }
        break;
    case 'D': //右移
    {
        if(ui->label->x() >= this->width())
        {
            ui->label->move(0,ui->label->y());
        }
        ui->label->move(ui->label->x()+2,ui->label->y());
    }
        break;
    }

}

实现对话框界面

#include "widget.h"
#include "ui_widget.h"

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

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


void Widget::on_btn1_clicked()
{
    //调用QFontDialog类中的静态成员函数,getFont函数来调取系统提供的字体对话框
    bool ok;        //用于接收用户是否选中了字体
    QFont f = QFontDialog::getFont(&ok,   //返回是否选中字体
                         QFont("黑体",12,12,false), //初始字体
                         this, //父组件
                         "选择字体"); //对话框标题
    //将选中的字体进行使用
    if(ok)
    {
        //选中了字体,将字体设置到文本上
        //ui->textEdit->setFont(f);
        ui->textEdit->setCurrentFont(f);
    }else
    {
        //没选中字体
        QMessageBox::information(this,"提示","您取消了选择字体",QMessageBox::Ok);
    }
}

void Widget::on_btn2_clicked()
{
    //调用静态成员函数,获取系统中的颜色对话框
    QColor c = QColorDialog::getColor(QColor("pink"), //初始颜色
                                      this,  //父组件
                                      "选择颜色"); //对话框标题
    if(c.isValid())
    {
        //颜色合法,直接使用
        //ui->textEdit->setTextColor(c);
        ui->textEdit->setTextBackgroundColor(c);
    }else
    {
        //颜色不合法
        QMessageBox::information(this,"提示","您取消了选择颜色");
    }
}

void Widget::on_btn3_clicked()
{
     QString filename = QFileDialog::getOpenFileName(this,   //父组件
                                  "选择文件",       //对话框标题
                                  "C:\\Users\\W\\Desktop",  //起始路径
                                  "Image File(*.png *.jpg *.bmp);;Text File(*.txt);;All(*.*)"); //过滤器
    if(filename.isNull())
    {
        QMessageBox::information(this,"提示","您取消了选择文件");
        return;
    }
    //输出文件路径
    qDebug()<<filename;

    //实例化一个文件对象
    QFile file(filename); //使用获取到的文件路径实例化一个文件对象,后期对文件的操作都是基于该对象
    //判断文件是否存在
    if(!file.exists())
    {
        return;
    }
    //打开文件
    if(!file.open(QFile::ReadWrite))
    {
        return;
    }
    //读取文件中的内容
    QByteArray msg = file.readAll();
    //将内容展示到ui界面
    ui->textEdit->setText(msg);
    //关闭文件
    file.close();
}

void Widget::on_btn4_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this,
                                 "保存文件",
                                 "./",
                                 "Image File(*.png *.jpg *.bmp);;Text File(*.txt);;All(*.*)");
    qDebug()<<fileName;
    //设置取消保存文件
    if(fileName.isNull())
    {
        QMessageBox::information(this,"提示","您取消了保存文件");
        return;
    }
    //实例化一个文件对象
    QFile file(fileName);
    //判断文件是否存在
    if(file.exists())
    {
        return;
    }
    ui->textEdit->toPlainText();
}


http://lihuaxi.xjx100.cn/news/1510034.html

相关文章

Unity中Shader的渲染排序Tags{“Queue“ = “Transparent“}

文章目录 前言一、在Unity中渲染排序一般是固定的几个层级&#xff0c;透明 和 半透明是以 2500 为 分界点&#xff0c;渲染层级 从 低 到 高二、渲染队列 可以 在 SubShader 或 Pass 中写 前言 Unity中Shader的渲染排序 一、在Unity中渲染排序一般是固定的几个层级&#xff0…

解决github图片及网页加载不出来

github时不时的抽风&#xff0c;即使用了代理也访问不了&#xff0c;加载不出页面上的图片和静态资源&#xff0c;下面介绍下几个常用的解决方法 kgithub kgithub 是一个公益加速项目&#xff0c;仅需在 github.com 前加上 k 即可&#xff0c;若提示访问限制请刷新任意 github…

stable diffusion实践操作-webUI教程

系列文章目录 stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、SD webUI是什么&#xff1f;二、详细教程1. 插件安装1.1. 提示词插件安装和使用 2. xyz 图表使用2.1…

一个 MySQL 数据库死锁的案例和解决方案

本文介绍了一个 MySQL 数据库死锁的案例和解决方案。 场景 生产环境出了一个偶现的数据库死锁问题&#xff0c;导致少部分业务处理失败。 分析特征之后&#xff0c;发现是多个线程并发执行同一个方法&#xff0c;更新关联的数据时可能会出现&#xff0c;把场景简化概括一下&…

[国产MCU]-W801开发实例-TCP客户端

TCP客户端 文章目录 TCP客户端1、TCP协议简单介绍2、W801创建TCP客户流程本文将详细介绍如何在W801中使用TCP客户端。 1、TCP协议简单介绍 传输控制协议 (TCP) 是一种标准,它定义了如何建立和维护应用程序可以用来交换数据的网络对话。 TCP 与 Internet 协议 (IP) 一起工作,…

在CentOS7上使用Docker安装和部署RabbitMQ

&#x1f680; 1 拉取RabbitMQ Docker镜像 首先&#xff0c;使用Docker命令从Docker Hub拉取RabbitMQ官方镜像。打开终端并运行以下命令&#xff1a; docker pull rabbitmq&#x1f680; 2 创建RabbitMQ容器 一旦镜像下载完成&#xff0c;使用以下命令创建RabbitMQ容器&…

ESP32在线仿真器

1. Wokwi是一个电子在线仿真平台&#xff0c;支持的芯片有ESP32,STM32,树莓派&#xff0c;Arduino 网址&#xff1a; https://wokwi.com ; 而且支持在vscode内置插件仿真 2. ESP32可以使用microPython开发&#xff0c;相关sdk说明MicroPython&#xff08;ESP32&#xff09;快…

Nginx安装和优化1

Nginx的安装和优化1 一、nginx简介1.1 概述1.2nginx和apache的优缺点比较1.3nginx作为web服务器与apache比较1.5nginx和apache最核心的区别 二、linux中的i/o三、nginx的编译安装步骤详解3.1关闭防火墙&#xff0c;安装依赖关系包3.2新建用户和组便于管理3.3、将压缩包传入到/o…