第二章:QT核心机制(二)

server/2025/2/12 13:22:22/

作业

1> 将鼠标事件和键盘事件相关代码重新实现一遍

//头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QKeyEvent>        //键盘事件类
#include <QDebug>
#include <QLabel>
#include <QMouseEvent>      //鼠标事件类QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//重写键盘按下事件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::MainWindow *ui;
};
#endif // MAINWINDOW_H
//源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//开启鼠标追踪功能this->setMouseTracking(true);
}MainWindow::~MainWindow()
{delete ui;
}//对键盘按下事件重写
void MainWindow::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;//判断是否为S字符case 'S':{//判断圆球是否脱离了整个界面if(ui->label->y() >= this->height()){//将租价移动到整个界面的最上方ui->label->move(ui->label->x(),0);}//将ui界面上的lab向下偏移ui->label->move(ui->label->x(),ui->label->y()+10);}break;//判断是否为A字符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;//判断是否为D字符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 MainWindow::keyReleaseEvent(QKeyEvent *event)
{qDebug()<<event->text()<<"被抬起,对应的键值为:"<<event->key();
}//对鼠标按下事件重写
void MainWindow::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::MiddleButton){qDebug()<<"鼠标中键被按下,界面下标为:"<<event->pos()<<",全局坐标为:"<<event->globalPos();}
}//对鼠标抬起事件重写
void MainWindow::mouseReleaseEvent(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::MiddleButton){qDebug()<<"鼠标中键被抬起,界面下标为:"<<event->pos()<<",全局坐标为:"<<event->globalPos();}
}//对鼠标双击事件重写
void MainWindow::mouseDoubleClickEvent(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::MiddleButton){qDebug()<<"鼠标中键被双击,界面下标为:"<<event->pos()<<",全局坐标为:"<<event->globalPos();}
}//对鼠标移动事件重写
void MainWindow::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::MiddleButton){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);
}
//主函数
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

2> 将文本编辑器功能完善

//头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFontDialog>      //打开字体对话框
#include <QFont>            //字体类
#include <QMessageBox>      //消息对话框
#include <QColorDialog>     //颜色对话框
#include <QColor>           //颜色类
#include <QFileDialog>      //文件对话框
#include <QDebug>
#include <QFile>            //文件类
#include <QInputDialog>     //输入对话框
#include <QStandardPaths>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_fontBtn_clicked();void on_colorBtn_clicked();void on_openFileBtn_clicked();void on_saveBtn_clicked();void on_inputBtn_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}//字体对话框对应的槽函数
void MainWindow::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 MainWindow::on_colorBtn_clicked()
{//调用静态成员函数,获取系统的颜色对话框QColor c = QColorDialog::getColor(QColor("white"),this,"选择颜色");//对选择的颜色进行判断if(c.isValid()){//表示用户点击的确定按钮ui->textEdit->setTextColor(c);              //设置字体颜色//ui->textEdit->setTextBackgroundColor(c);  //设置文本背景颜色}else{//用户点击的取消按钮QMessageBox::information(this,"提示","用户取消了选择颜色");}
}//打开文件按钮对应的槽函数
void MainWindow::on_openFileBtn_clicked()
{//调用文件对话框的具体成员函数,打开系统的文件对话框QString fname = QFileDialog::getOpenFileName(this,"选择文件","./","all(*.*);;text(*.txt);;image(*.png *.jpg *.xpm);;soures(*.cpp)");qDebug()<<fname;//进行文件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,"提示","文件打开失败!");}//程序执行至此,表示文件已经打开//读取文件中的数据QByteArray msg = f.readAll();//将读取出来的数据,展示到ui界面文本编辑器中ui->textEdit->setText(QString(msg));//4、关闭文件f.close();
}//另存为对话框对应的槽函数
void MainWindow::on_saveBtn_clicked()
{// 调用文件对话框的具体成员函数,打开系统的文件对话框QString fname = QFileDialog::getSaveFileName(this,"保存文件","./","文本文件 (*.txt);;所有文件 (*.*);;图片文件 (*.png *.jpg *.xpm);;源代码文件 (*.cpp)");// 检查用户是否选择了文件名if (fname.isEmpty()) {qDebug() << "用户取消了保存操作";return;}qDebug() << "选择的保存文件名: " << fname;// 进行文件 I/O 操作// 1、实例化一个文件对象QFile file(fname);// 2、尝试以写入模式打开文件if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::critical(this, "错误", QString("无法打开文件 %1 进行写入: %2").arg(fname).arg(file.errorString()));return;}// 3、创建文本流对象并写入示例文本QTextStream out(&file);out.setCodec("UTF-8");// 读取文本框内的内容并写入文件QString content = ui->textEdit->toPlainText();out << content;// 4、关闭文件file.close();QMessageBox::information(this, "提示", "文件已成功保存!");
}//输入对话框对应的槽函数
void MainWindow::on_inputBtn_clicked()
{bool ok;            //判断用户是否确定输入//调用静态成员函数,获取一个输入对话框QString text = QInputDialog::getText(this,      //父组件"输入文本",                   //对话框标题"请输入密码",                //输入框提示文本QLineEdit::Password,            //输入模式"",                 //输入框中的默认文本&ok);                         //判断用户是选中的输入的输入的数据//对ok进行判断if(ok == true){//表示用户确定了输入的数据,可以正常使用数据了qDebug()<<text;}else{QMessageBox::information(this,"提示","已取消输入");}
}
  
//主函数
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

3> 思维导图 

4> 牛客网上 C和C++ 各实现一个 28 的刷题结果


http://www.ppmy.cn/server/167069.html

相关文章

物联网综合性应用之网关设计

最近由于项目的需要&#xff0c;设计了一款基于rv1106的物联网网关 该产品需要集合IOT功能 BLE定位 能耗监测io控制等&#xff0c;音视频通话&#xff08;基于webrtc&#xff09; 由于概念机阶段不想自己开板于是乎找到万能的淘宝相中了顶配版的luckfox pico w. 理由是 1 、…

软考通过率仅有10% ?或许2025年更难?

软考的通过率是有具体数据的&#xff0c;各地的通过率在其他帖子中都有提及&#xff0c;这里就不再赘述了。 总体来说&#xff0c;中级的通过率大约在20%-25%之间&#xff0c;高级的通过率在10%-15%左右。 从这个数据来看&#xff0c;怎么也不能算高吧。 然而&#xff0c;网…

Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端

**TCP传输&#xff1a;**两个端点的建立连接后会有一个传输数据的通道&#xff0c;这通道称为流&#xff0c;而且是建立在网络基础上的流&#xff0c;称之为socket流。该流中既有读取&#xff0c;也有写入。 **tcp的两个端点&#xff1a;**一个是客户端&#xff0c;一个是服务…

22.3、IIS安全分析与增强

目录 IIS安全威胁分析iis安全机制iis安全增强 IIS安全威胁分析 iis是微软公司的Web服务软件&#xff0c;主要提供网页服务&#xff0c;除此之外还可以提供其他服务&#xff0c;第一个最主要的是网页服务&#xff0c;第二个是SMTP邮件服务&#xff0c;第三个是FTP文件传输服务。…

ES传输带宽优化方案

背景&#xff1a;目前日志从kafka中消费后转存ES,是通过批量发送的方式打入ES&#xff0c;但是如果数据量很大那么就会占用很多的带宽&#xff0c;而目前正在降本增效&#xff0c;无法增加带宽或者服务节点。 源码在最下方&#xff01;&#xff01; 限流牺牲磁盘作为代价 从…

C语言基础11:分支结构以及if的使用

C语言基础 内容提要 分支结构 条件判断用if语句实现分支结构 分支结构 问题抛出 我们在程序设计往往会遇到如下问题&#xff0c;比如下面的函数的计算&#xff1a; y { 1 / x 当 x ≠ 0 时 10000 当 x 0 时 y \begin{cases} 1/x \quad当x\neq0时\\ \\ 10000 \quad当x0…

uni getLocation 公众号h5获取定位坐标没有返回

先看代码 //获取经纬度getLocation() {console.log("111")uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; res.latitude);},fail: function(err) {conso…

vue 134~152

认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> import { ref } from vue const count ref(0) const addCount ()> count.value &l…