2025.2.10

发布于:2025-02-11 ⋅ 阅读:(12) ⋅ 点赞:(0)

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++:

 


网站公告

今日签到

点亮在社区的每一天
去签到