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