#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");
}
04-project
最新推荐文章于 2024-11-02 17:47:31 发布