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