QSizeGrip 是干嘛用的,Manual中如是说:
- The QSizeGrip class provides a resize handle for resizing top-level windows.
它一般位于顶级窗口(QMainWindow或QDialog)的右下角
- 它是QWidget的派生类,你可以放置到另一个QWidget的任何位置
- 通过它可以改变它所在顶级窗口的大小
BUG?
当看到下面这些东西的时候
-
QTBUG-13975:
QSizeGrip does not handle ESC or ALT-TAB correctly on Windows
-
QTBUG-13074:
QSizeGrip not giving MouseButtonRelease Event on Windows
-
QTBUG-7350: QStatusBar::setSizeGripEnabled
( false ) has no effect on Mac OS X
-
QTBUG-22867:
QSizeGrip crashes when reparented
- ...
突然感觉的到这个看似普通的,而且源码短小的QWidget的派生类,似乎大有看头
源码
几乎所有的QWidget的派生类都会重新实现
void paintEvent(QPaintEvent *);
QSizeGrip也不例外。
QSizeGrip主要就是响应鼠标左键动作,故尔,重新实现
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *mouseEvent);
这部分是重点(先略过吧)
QSizeGrip需要根据其所处的顶级窗口的状态(最大化、全屏等)来决定其是否隐藏,这是通过事件过滤器来实现的。
bool QSizeGrip::eventFilter(QObject *o, QEvent *e)
{
Q_D(QSizeGrip);
if ((isHidden() && testAttribute(Qt::WA_WState_ExplicitShowHide))
|| e->type() != QEvent::WindowStateChange
|| o != d->tlw) {
return QWidget::eventFilter(o, e);
}
Qt::WindowStates sizeGripNotVisibleState = Qt::WindowFullScreen;
#ifndef Q_WS_MAC
sizeGripNotVisibleState |= Qt::WindowMaximized;
#endif
// Don't show the size grip if the tlw is maximized or in full screen mode.
setVisible(!(d->tlw->windowState() & sizeGripNotVisibleState));
setAttribute(Qt::WA_WState_ExplicitShowHide, false);
return QWidget::eventFilter(o, e);
}
配合这个东西,QSizeGripPrivate 中:
void updateTopLevelWidget()
{
Q_Q(QSizeGrip);
QWidget *w = qt_sizegrip_topLevelWidget(q);
if (tlw == w)
return;
if (tlw)
tlw->removeEventFilter(q);
tlw = w;
if (tlw)
tlw->installEventFilter(q);
}
// This slot is invoked by QLayout when the size grip is added to
// a layout or reparented after the tlw is shown. This re-implementation is basically
// the same as QWidgetPrivate::_q_showIfNotHidden except that it checks
// for Qt::WindowFullScreen and Qt::WindowMaximized as well.
void _q_showIfNotHidden()
{
Q_Q(QSizeGrip);
bool showSizeGrip = !(q->isHidden() && q->testAttribute(Qt::WA_WState_ExplicitShowHide));
updateTopLevelWidget();
if (tlw && showSizeGrip) {
Qt::WindowStates sizeGripNotVisibleState = Qt::WindowFullScreen;
#ifndef Q_WS_MAC
sizeGripNotVisibleState |= Qt::WindowMaximized;
#endif
// Don't show the size grip if the tlw is maximized or in full screen mode.
showSizeGrip = !(tlw->windowState() & sizeGripNotVisibleState);
}
if (showSizeGrip)
q->setVisible(true);
}
此外,QSizeGrip会跟着所在窗口移动,所以
void moveEvent(QMoveEvent *moveEvent);
分享到:
相关推荐
【咬人草小记,阅读附答案】 咬人草小记阅读答案.docx
流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记....
环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed ...小记一下。以备以后参考。 boost 库做得真好。在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。 全部编译是很痛苦的过程
TCP-IP小记
很全面的,很实用的,看完提高不少,不管新手老手,都绝对有用
python进行爬虫小记,主要用于python快速入门理解。
随笔小记.doc
GeoStudio学习小记
我做java web 多年的小记,希望能打大家有用
c语言理论知识小记
海居小记
asp.net Jmail组件使用小记
redis安全学习小记1
本草缘·种植小记
Sqlite数据库sqlite3命令小记
vuex使用方法,小记总结
NULL 博文链接:https://zfwdl2005.iteye.com/blog/1308748
PHPweb渗透小记.docx
关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记
刘重威将军小记.docx