目录
介绍:
- GUI应用程序是由事件(event)驱动的,点击鼠标,按下按键,窗口大小改变等等
- 按事件的来源,可以将事件划分为3类:
自生事件(spontaneous event):由窗口系统产生,如:QKeyEvent、QMouseEvent。自生事件会进入系统队列,等待事件循环的处理。
发布事件(posted event):是由Qt应用程序产生,如:QTimerEvent。使用QCoreApplication::postEvent()产生发布事件,等待事件循环的处理。
发送事件(sent event):有QT或其他程序定向发送的事件。使用QCoreApplication::sendEvent()产生发送事件,有对象的event()函数直接处理。 - Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生的系统事件,将它们转换为QEvent,并将转换后的事件发送给QObject。任何QObject派生的类都可以处理事件
来源参考:
事件类:
rect():返回需要绘制的区域的矩形范围;
region():返回需要绘制的区域的 QRegion 对象;
isAccepted():返回一个布尔值,表示是否接受该事件;
accept():标记该事件为已接受,阻止事件进一步传递;
ignore():忽略该事件,允许事件继续传递。
案例1:
protected:
virtual void closeEvent(QCloseEvent *event) override;//窗口关闭时
virtual void paintEvent(QPaintEvent *event) override;//用于触发绘图操作
virtual void keyPressEvent(QKeyEvent *event) override;//键盘点击
virtual void mousePressEvent(QMouseEvent *event) override;//鼠标点击
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()!=Qt::LeftButton)
return;
QPoint pt=event->pos();//相对widget的位置
QPointF relaPt=event->position();
QPointF winPt=event->scenePosition();
QPointF globPt=event->globalPosition();//相对屏幕的绝对位置
QString str=QString::asprintf("pos()=(%d,%d)",pt.x(),pt.y());
str+=QString::asprintf("\nposition()=(%.0f,%.0f)",relaPt.x(),relaPt.y());
str+=QString::asprintf("\nscenePosition()=(%.0f,%.0f)",winPt.x(),winPt.y());
str+=QString::asprintf("\nglobalPos()=(%.0f,%.0f)",globPt.x(),globPt.y());
ui->labMove->setText(str);
ui->labMove->adjustSize();
ui->labMove->move(event->pos());
QWidget::mousePressEvent(event);
}
void Widget::keyPressEvent(QKeyEvent *event)
{
QPoint pt=ui->btnMove->pos();
if((event->key()==Qt::Key_A)||(event->key()==Qt::Key_Left))
ui->btnMove->move(pt.x()-20,pt.y());
if((event->key()==Qt::Key_D)||(event->key()==Qt::Key_Right))
ui->btnMove->move(pt.x()+20,pt.y());
if((event->key()==Qt::Key_W)||(event->key()==Qt::Key_Up))
ui->btnMove->move(pt.x(),pt.y()-20);
if((event->key()==Qt::Key_S)||(event->key()==Qt::Key_Down))
ui->btnMove->move(pt.x(),pt.y()+20);
QWidget::keyPressEvent(event);
}
void Widget::paintEvent(QPaintEvent *event)//背景加载
{
Q_UNUSED(event);
QPainter painter(this);
painter.drawPixmap(0,0,width(),this->height(),
QPixmap(":/pics/images/background.jpg"));
}
void Widget::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton result=QMessageBox::question(
this,"消息框","确定要退出吗?",
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if(result==QMessageBox::Yes)
event->accept();
else
event->ignore();
}
案例2:
//MyButton.h:
#include <QPushButton>
#include <QMouseEvent>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget* parent = nullptr) : QPushButton(parent) {}
protected:
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton) {
// 处理鼠标左键点击事件
qDebug() << "LeftButton clicked";
}
else if (event->button() == Qt::RightButton) {
// 处理鼠标右键点击事件
qDebug() << "RightButton clicked";
}
}
};
//MainWindown.cpp:
QVBoxLayout* vlay = new QVBoxLayout();
QPushButton* btn = new QPushButton("demo",this);
MyButton* btn1 = new MyButton(this);
btn1->setText("demo2");
vlay->addWidget(btn);
vlay->addWidget(btn1);
this->setLayout(vlay);
connect(btn, &QPushButton::clicked, []() {
qDebug("demo1111");
});
标签:事件处理,Qt,pt,void,C++,事件,Key,event,QT
From: https://www.cnblogs.com/zhouyitty/p/17697824.html