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

对话框

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

消息对话框

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

基于属性版本的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 
#include  //键盘处理事件
#include 
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();
}

你可能感兴趣的:(qt,开发语言)