当前位置: 首页 > wzjs >正文

做网站上传照片的尺寸百度一下百度搜索首页

做网站上传照片的尺寸,百度一下百度搜索首页,花钱做网站不给部署,新闻网站给企业做专题策划一、事件介绍 事件的来源 :由用户操作或系统内部产生,Qt平台会将系统产生的消息转换为Qt事件。 事件本质 :Qt事件是一个QEvent的对象,用来描述程序内部或外部发生的动作,任意的QObject对象都具备事件处理的能力。 常…

一、事件介绍

  • 事件的来源 :由用户操作或系统内部产生,Qt平台会将系统产生的消息转换为Qt事件。

  • 事件本质 :Qt事件是一个QEvent的对象,用来描述程序内部或外部发生的动作,任意的QObject对象都具备事件处理的能力。

  • 常见事件类型 :用户界面事件(鼠标事件QMouseEvent、键盘事件QKeyEvent、触摸事件QTouchEvent等)、系统事件(定时器事件QTimerEvent、窗口事件QResizeEvent、绘图事件QPaintEvent等)、自定义事件(通过继承QEvent创建,以适应应用程序特定需求)。

二、事件处理

  • 事件处理流程

    • 事件生成 :由操作系统或Qt内部生成,如鼠标点击、定时器触发等。

    • 事件入队 :事件被添加到应用程序的事件队列中。

    • 事件分发 :事件轮询从队列中取出事件,通过QCoreApplication::notify()分发给目标对象。

    • 事件处理 :事件到达目标对象后,进行处理。

  • 事件轮询(Event Loop)

    • 基本概念 :是GUI应用程序的核心机制,负责处理用户输入、系统消息和定时器等异步事件,是一个无限循环,不断从事件队列中获取事件并分发给相应的事件处理函数,由QCoreApplication::exec()启动,通常在main()函数中调用,调用app.quit()app.exit()才会退出。

    • 事件传播机制 :事件先传播到当前产生事件的焦点控件上,经当前控件处理后决定是否传递给其父容器控件。

  • 重写事件处理函数

  • 自定义控件类 :可以通过创建继承自相应控件类的自定义类,并重写其事件处理函数来实现特定的事件处理逻辑,如创建一个继承自QPushButtonCustomPushButton类,并重写mousePressEvent()函数来处理鼠标按下事件。

    // custompushbutton.h
    #ifndef CUSTOMPUSHBUTTON_H
    #define CUSTOMPUSHBUTTON_H
    #include <QPushButton>
    #include <QWidget>
    class CustomPushButton : public QPushButton
    {Q_OBJECT
    public:explicit CustomPushButton(QWidget *parent = nullptr);
    signals:
    };
    #endif // CUSTOMPUSHBUTTON_H// custompushbutton.cpp
    #include "custompushbutton.h"
    CustomPushButton::CustomPushButton(QWidget *parent): QPushButton{parent}
    {
    }// custompushbutton.h
    class CustomPushButton : public QPushButton
    {
    public:void mousePressEvent(QMouseEvent *e);
    };// custompushbutton.cpp
    #include <QDebug>
    void CustomPushButton::mousePressEvent(QMouseEvent *e)
    {qDebug() << "CustomPushButton::mousePressEvent";
    }
    * **提升控件为自定义类** :在Qt Creator中,将界面文件中的控件提升为自定义控件类,使其能够使用自定义的事件处理逻辑。* **可能导致的问题及解决办法** :如头文件路径问题,需要在cmake文件中添加向工程目录查找的命令;构建时类型转换错误,需确保自定义类正确继承自目标控件类且正确实现构造函数;提升为自定义控件后原有信号对应的槽函数未执行,需在自定义事件处理函数中确保发送相应的信号。

  • 事件过滤器

    • 基本概念 :是Qt中的一种机制,用于拦截和处理事件,可以在事件到达目标对象之前进行检查和处理,实现对事件的精细控制,特别适用于希望在多个对象之间共享事件处理逻辑的情况。

    • 工作原理 :通过installEventFilter()方法将事件过滤器安装到一个对象上,事件过滤器对象需重写eventFilter()函数,当事件发生时,它会被发送到事件过滤器的eventFilter()方法,可根据需要决定是否处理事件、是否传递事件给目标对象,eventFilter()方法的返回值决定了事件是否被进一步传递,返回true表示事件已被处理不再传递给目标对象,返回false则事件继续传递给目标对象。

  • 示例代码:

  • // 安装事件过滤器
    ui->pushButton->installEventFilter(this);// 过滤器对象重写eventFilter
    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {if (obj == ui->pushButton) {if (event->type() == QEvent::MouseButtonPress) {qDebug() << "Do Not Process";return true;}}return QMainWindow::eventFilter(obj, event);
    }

三、事件VS信号

  • 事件

    • 定义 :由具体对象进行处理,Qt使用事件队列对所有发出的事件进行维护,新的事件产生时追加到事件队列尾部。

    • 处理方式 :通过重写事件处理函数来处理事件,事件可以使用事件过滤器进行过滤。

    • 对程序行为的影响 :改写事件处理函数可能导致程序行为发生改变。

  • 信号

    • 定义 :由具体对象主动产生,一旦发出,对应关联的槽函数一定会被执行。

  • 与事件的联系 :一般而言,信号在具体的事件处理函数中产生。

四、QEventLoop

  • 定义与作用QEventLoop类提供了进入和离开事件循环的方法,可以创建一个QEventLoop对象并调用它的exec()方法来启动一个局部的事件循环,从事件循环内部调用exit()方法将会使exec()方法返回。
  • 应用场景 :例如,在主界面执行某个代码之前需要等待某个条件成立,而该条件由其他线程异步通知,此时可使用QEventLoop使主线程等待条件成立而不卡主界面;也可用于模态对话框的显示,如调用QDialogexec()方法以模态方式显示对话框,其内部使用了事件循环来等待对话框结束。
  • 示例代码:

 

// 使用QTimer与QEventLoop配合
void MainWindow::on_pushButton_clicked()
{qDebug() << "start event loop";QEventLoop loopObject;QTimer::singleShot(3 * 1000, &loopObject, &QEventLoop::quit);loopObject.exec();qDebug() << "ok";
}// 使用QDialog与QEventLoop配合
void MainWindow::on_pushButton_2_clicked()
{qDebug() << "open a dialog";QDialog qDialog;qDialog.show();QEventLoop loopObject;connect(&qDialog, &QDialog::finished, &loopObject, &QEventLoop::quit);loopObject.exec();
}

五、常见问题与注意事项

  • 自定义控件中信号发射问题 :如QPushButtonmouseReleaseEvent中会检查鼠标是否在按钮区域内按下和释放,若满足条件则发射releasedclicked信号,若在自定义控件中未正确调用父类的mouseReleaseEvent实现,则可能导致信号无法正常发射。

示例代码:

// 正确实现mouseReleaseEvent
#include <QMouseEvent>
void CustomerPushButton::mousePressEvent(QMouseEvent *e)
{qDebug() << "CustomerPushButton::mousePressEvent";// 调用父类的mousePressEvent实现,确保down标志被正确设置QPushButton::mousePressEvent(e);
}void CustomerPushButton::mouseReleaseEvent(QMouseEvent *e)
{qDebug() << "CustomerPushButton::mouseReleaseEvent";// 检查鼠标是否在按钮区域内释放,并且左键被释放if (rect().contains(e->pos()) && e->button() == Qt::LeftButton) {emit clicked();}// 调用父类的实现,处理其它必要的操作QPushButton::mouseReleaseEvent(e);
}
  • 事件过滤器的使用注意事项 :正确安装事件过滤器,并在eventFilter()函数中合理处理事件,避免影响正常的程序逻辑。

http://www.dtcms.com/wzjs/155822.html

相关文章:

  • 做盗版电影网站赚钱吗seo优化课程
  • 如何查询一个网站所属的主机sem竞价开户
  • 做网站的时候网站的第一个字母怎么在网站标题前面显示 比如谷歌g一样百度网页入口
  • 辽宁网站制作seo流量工具
  • 工业物联网平台seo标题优化关键词怎么选
  • 沈阳装修公司网站建设发外链平台
  • 如何用dw做动态网站百度收录链接提交入口
  • 网站目录做二级域名经典软文案例标题加内容
  • 建设pc端网站是什么意思完整的品牌推广方案
  • 网站建设工资多少钱成都网站优化排名
  • 微信小程序api是什么优化设计一年级下册数学答案
  • 许昌工程建设信息网站2021年中国关键词
  • qq做兼职给网站给你打开百度首页
  • 好看的官网源码网站优化网站
  • 公司网站建设的签订合同自建网站流程
  • 公司建设网站费用属于什么费用外贸推广平台
  • 宁波大型网站制作网站优化推广排名
  • 什么网站有做面条的appseoul是韩国哪个城市
  • 密云青岛网站建设广告投放价目表
  • 住房与城乡建设厅网站如何点击优化神马关键词排名
  • 技术支持 石家庄网站建设枸橼酸西地那非片多长时间见效
  • 网站建设与管理总结报告推广之家
  • dw简易网站怎么做推广软件有哪些
  • 上海聚通装修公司地址烟台seo关键词排名
  • 基于h5的企业网站建设成都seo优化
  • 世界顶尖名表瑞士网站不要中国手表网站三生网络营销靠谱吗
  • 怎么做联盟网站互联网销售怎么做
  • 发布了一个网站 显示建设中网络热词的利弊
  • 杭州电信网站备案百度下载2022新版安装
  • 现在做外贸还能挣钱吗seo 深圳