9/10作业

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

1> 这三个对话框,一般都是使用静态成员函数版本实现

2> 颜色对话框

[static] QColor                          //函数返回值类型,是一个颜色类对象
    QColorDialog::getColor(               //函数名
        const QColor &initial = Qt::white,      //打开对话框后的初始颜色
        QWidget *parent = nullptr,                //父组件
        const QString &title = QString())        //对话框标题
所需要的类:
QColor:颜色类
QColorDialog:颜色对话框类       

2> 字体对话框

[static] QFont                              //返回值类型,是一个字体类的对象
    QFontDialog::getFont(                   //函数名
        bool *ok,                            //用于地址传递,判断用户是否选中了某个字体
        const QFont &initial,                 //初始字体,对话框中的第一个字体,如果用户点击了取消,则将该字体作为函数返回值
        QWidget *parent = nullptr,                //父组件
        const QString &title = QString())         //对话框标题
该函数所需要的类:
QFontDialog                 //字体对话框类
QFont                       //字体类

举个例子:
  bool ok;
  QFont font = QFontDialog::getFont(&ok, QFont("Times", 12), this);
  if (ok) {
      // font is set to the font the user selected
  } else {
      // the user canceled the dialog; font is set to the initial
      // value, in this case Times, 12.
  }
 

3> 文件对话框

保存文件文件路径
[static] QString                                            //返回值类型:是用户选中的文件路径,该字符串可以不存在
    QFileDialog::getSaveFileName(                        //函数名
        QWidget *parent = nullptr,                     //父组件
        const QString &caption = QString(),                 //对话框标题
        const QString &dir = QString(),                 //遍历文件系统时的起始路径
        const QString &filter = QString())            //过滤器
所需类:QFileDialog

--------------------------------------------------------
打开文件文件路径
[static] QString 
    QFileDialog::getOpenFileName(
        QWidget *parent = nullptr, 
        const QString &caption = QString(), 
        const QString &dir = QString(), 
        const QString &filter = QString())

4> Qt中的文件io操作

1、依赖的类是QFile
2、使用QFile类实例化对象,用该对象对文件进行读写操作
3、可以使用构造函数打开文件,也可以调用无参构造,使用open函数打开文件
4、文件读写函数,read、readLine、readAll 、write
5、关闭文件close
举个例子:

    //QT中文件操作
    QFile file(fileName);             //使用得到的文件路径创建一个文件对象


    //以写的形式打开文件
    if(!file.open(QFile::WriteOnly|QFile::Text|QFile::Truncate))
    {
        return ;
    }


    //说明文件已经打开
    //获取ui界面上文本编辑器上的内容
    QString msg = ui->textEdit->toPlainText();
    file.write(msg.toLocal8Bit());            //将信息写入文件
    
    //关闭文件
    file.close();

5.4 输入对话框(QInputDialog)

1> 输入对话框可以提供一个字符串、整数、小数等的输入框

2> 一般也是使用静态成员函数来完成

3> getText为例

[static] QString                          //    返回值类型,用户在输入框中输入的内容
    QInputDialog::getText(                 //函数名
        QWidget *parent,                     //父组件
        const QString &title,                 //对话框标题
        const QString &label,                 //输入框的标签
        QLineEdit::EchoMode mode = QLineEdit::Normal,   //输入框模式
        const QString &text = QString(),         //输入框中的默认文本内容
        bool *ok = nullptr)                        //用于接收判断是否点击确认
举个例子:
    bool ok = false;


    QString text = QInputDialog::getText(this,               //父组件
                                         "您想说啥",          //对话框标题
                                         "姓名",              //输入框的介绍
                                         QLineEdit::Normal,   //输入框的模式
                                         "张三",              //输入框中的默认文本
                                         &ok);              //接收用户是否确认输入
    if(ok && !text.isEmpty())
    {
        qDebug()<<"姓名为"<<text;
    }

六、事件处理机制

6.1 事件处理函数简介(重点)

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> 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,
   而组件的实现者更关心覆盖哪些事件处理函数
   5>    以上事件处理函数的虚函数,是所有QWidget类的所有子类都拥有的成员虚函数,只需要进行重写这些函数即可
 

6.2 事件处理函数由来

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");
     }
 

6.3 鼠标和键盘事件

1> 对于键盘事件而言,如果长按键盘,则系统默认会认为一段时间后自动抬起并重新按下

2> 对于鼠标事件而言,如果没有抬起,就没有抬起

    [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)  //

3> 有关QKeyEvent类的相关函数

count():返回本次触发键盘事件的按下键的个数
text():返回本事件中操作的键的文本内容
key():返回本事件中的操作的键的值

4> 有关QMouseEvent类的相关函数

6.4 定时器事件

1> 程序员有时需要做某些事,按照指定时间来完成,此时就可以使用定时器完成

原理:当启动一个定时器后,系统会每隔给定的超时时间后,自动调用某些函数来做相关的功能

2> 定时的实现QT中提供两种

基于属性版本(QTimer类)

基于事件处理函数版本(无需其他类,使用自身的定时器事件处理函数)

3> 基于属性版本的定时器(本质上是信号与槽机制)

1、使用类QTimer实例化对象
2、通过对象调用成员函数 start(sec);启动一个定时器,每隔src毫秒后会自动发射一个timeout的信号
3、将timeout的信号连接到自定义的槽函数中
4、这样就营造出每隔sec毫秒后,系统自动调用自定义的槽函数了
5、停止一个定时器:stop函数完成

4> 基于事件处理函数版本

1、重写自身提供的 timerEvent函数
2、在程序所需处,调用自身提供的成员函数:startTimer(sec),之后,会每隔src毫秒后,系统自动调用 timerEvent 事件处理函数
3、如果不需要使用定时器了,删除定时器使用自己提供的函数 killTimer(id)

作业

widget.cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,btn1(new QPushButton)
    ,btn2(new QPushButton)
    ,lab1(new QLabel)
    ,edit1(new QLineEdit)
    ,edit2(new QTextEdit)
{

    ui->setupUi(this);

    tid=this->startTimer(100);

    this->resize(400,300);      //更改界面尺寸
    this->setFixedSize(400,300);
    this->setWindowTitle("闹钟");
    this->setStyleSheet("background-color:pink;");

    btn1->setParent(this);
    btn1->setText("启动");
    btn1->move(205,50);
    btn1->resize(90,30);
    connect(btn1,&QPushButton::clicked,this,&Widget::my_slot1);

    btn2->setParent(this);
    btn2->setText("取消");
    btn2->move(btn1->x()+btn1->width()+10,btn1->y());
    btn2->resize(90,30);
    btn2->setEnabled(false);
    connect(btn2,&QPushButton::clicked,this,&Widget::my_slot2);

    lab1->setParent(this);
    lab1->move(5,5);
    lab1->resize(190,80);
    QFont ft;
    ft.setPointSize(20);
    lab1->setFont(ft);
    lab1->setAlignment(Qt::AlignCenter);
    lab1->setStyleSheet("background-color:white;");

    edit1->setParent(this);
    edit1->move(205,5);
    edit1->resize(190,40);
    edit1->setFont(ft);
    edit1->setStyleSheet("background-color:white;");
    edit1->setAlignment(Qt::AlignCenter);

    edit2->setParent(this);
    edit2->resize(390,205);
    QFont ft2;
    ft2.setPointSize(30);
    edit2->setFont(ft);
    edit2->move(5,90);
    edit2->clear();
    edit2->setPlaceholderText("备忘录");
    edit2->setStyleSheet("background-color:Lavender;");

    QTime tim;
    tim.fromString(edit1->text(),"HH:mm");

}

Widget::~Widget()
{
    delete ui;
    delete btn1;
    delete btn2;
    delete lab1;
    delete edit1;
}

void Widget::my_slot1()
{

    btn1->setEnabled(false);
    btn2->setEnabled(true);
    edit1->setEnabled(false);
    naozhong=true;
}

void Widget::my_slot2()
{
     btn1->setEnabled(true);
     btn2->setEnabled(false);
     edit1->setEnabled(true);
     naozhong=false;
}

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()==tid)
    {
        QTime time=QTime::currentTime();
        QString tm=time.toString("hh:mm:ss");
        lab1->setText(tm);
        if(lab1->text()==edit1->text()&&naozhong)
        {
            QMessageBox::information(this,               //父组件
                                         "信息",                         //对话框标题
                                         "时间到咯",                   //对话框文本内容
                                         QMessageBox::Yes,   //提供的按钮
                                         QMessageBox::Yes);
        }
    }
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPushButton>
#include<QLabel>
#include<QLineEdit>
#include<QTextEdit>
#include<QTimerEvent>
#include<QTime>
#include<QFont>
#include<QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QPushButton *btn1;
    QPushButton *btn2;
    QLabel *lab1;
    QLineEdit *edit1;
    QTextEdit *edit2;
    
    bool naozhong;

private slots:
    void my_slot1();
    void my_slot2();


private:
    int tid=0;
    void timerEvent(QTimerEvent *event)override;
};
#endif // WIDGET_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值