作业
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 的刷题结果