1> 将鼠标事件和键盘事件相关代码重新实现一遍
.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QKeyEvent> //键盘事件类
#include <QDebug>
#include <QMouseEvent> //鼠标事件类
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;
//重写鼠标按下事件处理函数
void mousePressEvent(QMouseEvent *event) override;
//重写鼠标抬起事件处理函数
void mouseReleaseEvent(QMouseEvent *event) override;
//重写鼠标双击事件处理函数
void mouseDoubleClickEvent(QMouseEvent *event) override;
//重写鼠标移动事件处理函数
void mouseMoveEvent(QMouseEvent *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);
this->setMouseTracking(true);
}
Widget::~Widget()
{
delete ui;
}
//重写键盘按下事件
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<< event->text()<<"被按下,对应的简直为:"<<event->key();
switch (event->key())
{
//判断是否为w字符
case 'W':
{
//判断圆球是否脱离了界面
if(ui->label->y() <= -ui->label->height())
{
//将组件移动到整个界面的最下方
ui->label->move(ui->label->x(),this->height());
}
//将ui界面上的lab向上偏移
ui->label->move(ui->label->x(),ui->label->y()-10);
}
break;
case 'S':
{
//判断圆球是否脱离了界面
if(ui->label->y() >=this->height())
{
//将组件移动到整个界面的最上方
ui->label->move(ui->label->x(),-ui->label->height());
}
//将ui界面上的lab向上偏移
ui->label->move(ui->label->x(),ui->label->y()+10);
}
break;
case 'A':
{
//判断圆球是否脱离了界面
if(ui->label->x() <= -ui->label->width())
{
//将组件移动到整个界面的最右方
ui->label->move(this->width(),ui->label->y());
}
//将ui界面上的lab向左偏移
ui->label->move(ui->label->x()-10,ui->label->y());
}
break;
case 'D':
{
//判断圆球是否脱离了界面
if(ui->label->x() >= this->width())
{
//将组件移动到整个界面的最左方
ui->label->move(-ui->label->width(),ui->label->y());
}
//将ui界面上的lab向上偏移
ui->label->move(ui->label->x()+10,ui->label->y());
}
break;
}
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
qDebug() << event->text()<<"被抬起,对应的键值为:"<<event->key();
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "鼠标左键被按下,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button()==Qt::RightButton)
{
qDebug() << "鼠标右键被按下,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button() == Qt::MidButton)
{
qDebug() << "鼠标中键被按下,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
//判断是哪个键被双击
if(event->button() == Qt::RightButton)
{
qDebug() << "鼠标左键被抬起,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button()==Qt::RightButton)
{
qDebug() << "鼠标右键被抬起,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button() == Qt::MidButton)
{
qDebug() << "鼠标中键被抬起,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
//判断是哪个键被双击
if(event->button() == Qt::RightButton)
{
qDebug() << "鼠标左键被双击,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button()==Qt::RightButton)
{
qDebug() << "鼠标右键被双击,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->button() == Qt::MidButton)
{
qDebug() << "鼠标右键被双击,界面下标为"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//判断是哪个键被移动
if(event->buttons() == Qt::LeftButton)
{
qDebug()<<"鼠标左键被移动,界面鞋标为:"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->buttons() == Qt::RightButton)
{
qDebug()<<"鼠标右键被移动,界面鞋标为:"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}else if(event->buttons() == Qt::MidButton)
{
qDebug()<<"鼠标中键被移动,界面鞋标为:"<<event->pos()<<" 全局坐标为"<<event->globalPos();
}
qDebug()<<"鼠标被移动,界面鞋标为:"<<event->pos()<<" 全局坐标为"<<event->globalPos();
ui->label->move(event->x()-ui->label->width()/2,event->y()-ui->label->height()/2);
}
2> 将文本编辑器功能完善
.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public slots:
void on_fontbtn_clicked();
void on_colorbtn_clicked();
void on_openbtn_clicked();
void on_savebtn_clicked();
void on_inputbtn_clicked();
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFontDialog> //字体对话框
#include <QFont> //字体类
#include <QMessageBox> //消息对话框
#include <QColorDialog> //颜色对话框
#include <QColor> //颜色类
#include <QFileDialog> //文件对话框
#include <QDebug>
#include <QFile> //文件类
#include <QInputDialog> //输入对话框对应的头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//字体对话框对应的槽函数函数
void Widget::on_fontbtn_clicked()
{
bool ok; //用于接收用户是否选中字体
//调用字体对话框的静态成员函数,打开字体对话框
QFont f = QFontDialog::getFont(&ok, //接收是否选中字体
QFont("楷体",10,10), //对话框初始字体
this, //父组件
"选择字体"); //对话框标题
//对是否选中字体进行判断
if(ok == true)
{
//将选择的字体设置到文本编辑器中
// ui->textEdit->setFont(f); //对所有编辑器中的字体进行设置
ui->textEdit->setCurrentFont(f); //设置选中的字体
}else
{
QMessageBox::information(this,"提示","用户取消了选择字体");
}
}
void Widget::on_colorbtn_clicked()
{
//调用静态成员函数,获取系统的颜色对话框
QColor c = QColorDialog::getColor(QColor("red"),
this,
"选择颜色");
//对选择的颜色进行判断
if(c.isValid())
{
//表示用户点击的确定按钮
//将选中的颜色,设置到文本编辑器中
//ui->textEdit->setTextColor(c); //设置字体颜色
ui->textEdit->setTextBackgroundColor(c); //设置字体背景色
}else
{
//用户点击的取消按钮
QMessageBox::information(this,"提示","用户取消了选择颜色");
}
}
void Widget::on_openbtn_clicked()
{
//调用文件对话框的静态成员函数,打开系统的文件对话框
QString fname = QFileDialog::getOpenFileName(this,
"选择文件",
"./",
"all(*.*);;text(*.txt);;Image(*.png *.jpg *.xpm);;soures(*.cpp)");
//进行文件IO操作
//1、实例化一个文件对象
QFile f; //使用无参构造
f.setFileName(fname); //设置要管理的文件 QFile f(fname)
//2、打开文件
if(!f.exists())
{
QMessageBox::information(this,"提示","文件不存在");
return;
}
if(!f.open(QFile::ReadOnly | QFile::WriteOnly))
{
QMessageBox::information(this,"提示","文件打开失败");
}
//程序执行至此,表示文件已经打开
//3、读取文件中的数据
QByteArray msg = f.readAll();
//将读取处理啊的数据,展示到ui界面中的文本编辑器中
ui->textEdit->setText(QString(msg));
//4、关闭文件
f.close();
//qDebug()<<fname;
}
void Widget::on_savebtn_clicked()
{
QString filename = QFileDialog::getSaveFileName(this,
"另存为",
"./",
"Text Files (*.txt);;All Files (*.*)");
if(!filename.isEmpty())
{
QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::warning(this, "错误", "无法保存文件");
return;
}
QTextStream out(&file);
// 获取文本编辑器中的内容并写入文件
out << ui->textEdit->toPlainText();
file.close();
QMessageBox::information(this, "提示", "文件保存成功");
}
else
{
QMessageBox::information(this, "提示", "用户取消了保存");
}
}
//输入对话框对应的槽函数
void Widget::on_inputbtn_clicked()
{
bool ok; //判断用户是否确定输入
//调用静态成员,获取一个输入对话框
QString text = QInputDialog::getText(this, //父组件
"输入文本", //对话框标题
"请输入姓名", //输入框提示文本
QLineEdit::Password, //输入框回显模式
"aaaa", //输入框中的默认文本
&ok); //判断用户是否选中的输入的数据
//对ok进行判断
if(ok == true)
{
//表示用户确定了输入的数据,可以正常使用数据了
qDebug()<< text;
}else
{
QMessageBox::information(this,"提示","用户取消了输入数据");
}
}
3> 思维导图
c:
c++: