对话框
消息对话框、字体对话框、颜色对话框、文件对话框
消息对话框
- 消息对话框提供了一个模态的对话框,用来提示用户信息,或者询问用户问题并得到回答
基于属性版本的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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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();
}