Qt绘制 QImage、QPixmap/事件处理

来源:互联网 发布:怎么p淘宝的代收货 编辑:程序博客网 时间:2024/05/16 12:57

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的多,可能是微软帝国太强大了吧。

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

0 0
原创粉丝点击