Qt绘制 QImage、QPixmap/事件处理

1. QImage、QPixmap、QPicture、QBitmap

     在界面上绘制图片是遇到了问题,就是在拖动界面的时候会看到背景默认的白色画刷,而且感觉程序卡卡的,因为这里用的QImage加载的图片,然后绘制到widget上面。

     后面改用了QPixmap加载图片进行绘制,发现好了很多,绘制的速度很快,也没有出现卡顿的现象了。

     查了一下Qt Asistant, 然后对了里面几种图的类有了一个大致的了解,

    QImage 提供设备无关图,可以对图片的每一像素进行访问,可以绘制在设备上面;那么利用它可以做一些图像的处理,他的绘制在设备上面的效率不如QPixmap

    QPixmap 是提供离屏图像,用于绘制在设备上面,速度是很快的。

    QPicture 这个类可以记录所绘制的内容(QPainter)保存为图像,同时可以讲图像绘制到设备上通过QPinter

    QBitmap 这个类是继承 QPixmap,色彩深度为1,超过1的则会出现抖动现象这里可能对图像处理认识应该知道,关于图像处理我也是小白

    前面三个类都是从QPaintDevice类派生而来 (ps: Qt中类真TM多啊)

2.在用布局的时候,建立工程的时候继承的是QMainWindow,然后后面利用setLayout的时候布局发现,不能布局而且控件都不能显示出来,这里就了解了QMainWindow的组成


用了Qt助手里面的一张图,QMainWindow有Menu bar、Toolbar、Dock Widget、idget、Status bar几个组成,当然你也可以去掉他们。布局的时候应该在Widget控件中,设置Widget的布局,即是可以用中间的 central Widget 来设置,既可以正常的完成显示所设置的布局。所建立的工程利用 ui designer设计的的则可以用 ui.centralWidget->setLayout(mainLayout),这里只是举个例子,具体要根据自己的代码情况来设置。

3. 在自绘的时候,会有鼠标离开的事件,发现有 mouseMoveEvent、 mousePressEvent、mouseReleaseEvent 等鼠标事件,不过就是没有mouseLeaveEvent ,然后我就去src源码文件夹找了 QWidget 的源码实现,这里截取了部分源码,发现都是在 event() 这个函数中事件的,然后根据不同的消息,做不同的处理。哦,原来明白了,可以去QEvent这个类中,去看不同的消息,比如

鼠标双击事件   QEvent::MouseButtonDblClick

鼠标单击事件   QEvent::MouseButtonPress

鼠标释放事件   QEvent::MouseButtonRelease

鼠标移动事件   QEvent::MouseMove

可以根据不同的消息类型做不同的事件处理,也应该知道这个event()函数肯定是个虚函数,这样我们可以在子类中重写自己的事件处理。

bool QWidget::event(QEvent *event)
{
    Q_D(QWidget);

    // ignore mouse events when disabled
    if (!isEnabled()) {
        switch(event->type()) {
        case QEvent::TabletPress:
        case QEvent::TabletRelease:
        case QEvent::TabletMove:
        case QEvent::MouseButtonPress:
        case QEvent::MouseButtonRelease:
        case QEvent::MouseButtonDblClick:
        case QEvent::MouseMove:
        case QEvent::TouchBegin:
        case QEvent::TouchUpdate:
        case QEvent::TouchEnd:
        case QEvent::ContextMenu:
#ifndef QT_NO_WHEELEVENT
        case QEvent::Wheel:
#endif
            return false;
        default:
            break;
        }
    }
    switch (event->type()) {
    case QEvent::MouseMove:
        mouseMoveEvent((QMouseEvent*)event);
        break;

    case QEvent::MouseButtonPress:
        // Don't reset input context here. Whether reset or not is
        // a responsibility of input method. reset() will be
        // called by mouseHandler() of input method if necessary
        // via mousePressEvent() of text widgets.
#if 0
        resetInputContext();
#endif
        mousePressEvent((QMouseEvent*)event);
        break;

    case QEvent::MouseButtonRelease:
        mouseReleaseEvent((QMouseEvent*)event);
        break;

    case QEvent::MouseButtonDblClick:
        mouseDoubleClickEvent((QMouseEvent*)event);
        break;

     case QEvent::NonClientAreaMouseButtonPress: {
        QWidget* w;
        while ((w = QApplication::activePopupWidget()) && w != this) {
            w->close();
            if (QApplication::activePopupWidget() == w) // widget does not want to disappear
                w->hide(); // hide at least
            }
        break;
        }
      ...还有很多的
}


初学Qt,,觉得Qt很强大的,跨平台,而且是开源的,不过发现用的人却不是特别的多,还不如MFC的多,可能是微软帝国太强大了吧。

慢慢的学习,慢慢的提高 .....

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值