04-project

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QColorDialog>

// 构造函数,初始化UI部件并将事件过滤器安装到lineEdit
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 安装事件过滤器,以便能够捕获lineEdit的按键事件
    ui->lineEdit->installEventFilter(this);
}

// 析构函数,释放UI资源
Widget::~Widget()
{
    delete ui;
}

// 重写timerEvent,处理定时器事件
// 当接收到的定时器ID与设定的timeId相同时,移动label的位置
void Widget::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == timeId)
    {
        // 获取label当前位置并计算新的x坐标,确保label在窗口内循环移动
        QPoint pos = ui->label->pos();
        if (pos.x() - 10 < 0)
            pos.setX(this->width());
        pos.setX(pos.x() - 10);

        // 移动label到新位置
        ui->label->move(pos);
    }
}

// 重写keyPressEvent,处理键盘按键事件
// 'T'键停止定时器,'S'键启动定时器
void Widget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_T)
    {
        // 停止定时器
        killTimer(timeId);
    }
    else if (event->key() == Qt::Key_S)
    {
        // 启动定时器,每1000毫秒触发一次timerEvent
        timeId = startTimer(1000);
    }
}

// 定义Widget类的一个成员函数,覆写QWidget的paintEvent事件处理器
// 当窗口部件需要重绘时,这个函数会被自动调用
void Widget::paintEvent(QPaintEvent *event)
{
    // 创建一个QPainter对象,用于在当前窗口部件(即this指代的Widget)上进行绘图
    QPainter painter(this);

    // 定义一个画笔pen,设置其颜色为绿色
    QPen pen(QColor(Qt::green));

    // 定义一个刷子brush,设置其颜色为白色
    QBrush brush(QColor(Qt::white));

    // 将当前画笔设置为定义好的绿色画笔
    painter.setPen(pen);

    // 将当前刷子设置为定义好的白色刷子
    painter.setBrush(brush);

    // 使用当前的画笔和刷子绘制一个矩形,占据Widget面积的三分之二
    painter.drawRect(0, 0, width() * 2 / 3, height());

    // 更新画笔宽度为用户界面中的spinBox组件的当前值
    pen.setWidth(ui->spinBox->value());

    // 设置画笔颜色为成员变量color所存储的颜色值
    pen.setColor(color);

    // 改变画笔样式为虚线
    pen.setStyle(Qt::DotLine);

    // 将更新后的画笔设置为当前画笔
    painter.setPen(pen);

    // 根据用户界面中comboBox的当前文本选择绘制图形类型
    if (ui->comboBox->currentText() == "Line")
    {
        // 若当前选项为"Line",则在start和end两点间绘制直线
        painter.drawLine(start, end);
    }
    else if (ui->comboBox->currentText() == "Rectangle")
    {
        // 若当前选项为"Rectangle",则以start和end点为对角顶点绘制矩形
        // 注意:这里假设end点与start点共同定义了矩形的一个对角线
        painter.drawRect(QRect(start, end));
    }

} // 结束paintEvent函数

//覆写QWidget的mousePressEvent事件处理器
// 当鼠标在Widget上按下时,此函数被调用
void Widget::mousePressEvent(QMouseEvent *event)
{
    // 记录鼠标按下时的位置,并将其赋值给全局或成员变量start
    start = event->pos();
}

//覆写QWidget的mouseMoveEvent事件处理器
// 当鼠标在Widget上移动且按着鼠标按钮时,此函数被调用
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    // 更新end变量为当前鼠标位置,这将在下次paintEvent触发时用于绘图
    end = event->pos();

    // 调用update()函数强制窗口部件重绘,以反映最新的鼠标移动状态
    update();
}

// 注:在实际应用中,start和end变量应当作为Widget的成员变量声明和初始化,
// 这样它们才能在mousePressEvent和mouseMoveEvent之间共享并用于paintEvent中的绘图操作。

// 重写eventFilter,用于监听指定对象(这里是lineEdit)的事件
// 当lineEdit按下空格键时,清空lineEdit的内容并返回true表示事件已被处理
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui->lineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            // 强制类型转换为QKeyEvent*
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

            // 检查是否按下的是空格键
            if (keyEvent->key() == Qt::Key_Space)
            {
                // 清空lineEdit的内容
                ui->lineEdit->clear();

                // 返回true表示该事件已在本方法中被处理,不再继续传递
                return true;
            }
        }
    }

    // 如果事件未在上述条件中处理,则调用父类的eventFilter方法
    return QWidget::eventFilter(watched, event);
}

// 下面这部分#if 0包裹的代码目前是禁用状态
// 若启用,原本打算在这里覆盖event方法以处理不同类型的事件
#if 0
// 重写event方法,但此处版本未被启用
bool Widget::event(QEvent *event)
{
#if 0
    // 此处的代码分支也是禁用状态
    // 如果启用,会根据不同的事件类型调用对应的处理函数
    switch (event->type())
    {
    case QEvent::KeyPress:
        keyPressEvent(event);
        break;
    case QEvent::MouseMove:
        mouseMoveEvent(event);
        break;
    case QEvent::Timer:
        timerEvent(event);
        break;
    default:
        break;
    }
#else
    // 另一种处理方式,仅处理KeyPress事件,其他事件交由父类处理
    if (event->type() == QEvent::KeyPress)
        return true;
    return QWidget::event(event);
#endif
}
#endif

//https://tongyi.aliyun.com/qianwen/share?shareId=2343634d-847d-4460-8c0f-2ab7880a4f57

void Widget::on_pushButton_clicked()
{
    color=QColorDialog::getColor(Qt::white,this,"Get Color");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值