QSizeGrip 小記
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);
相關文章
- vue小記Vue
- 面試小記面試
- Cookie小記Cookie
- webpack小記Web
- JAVA小記Java
- autoprefixer小記
- PostgreSQL小記SQL
- java小記-Java
- 小記 Demo
- 延安小記
- 微信小程式開發小記微信小程式
- 分治FFT小記?FFT
- sed命令小記
- Git命令小記Git
- golang 切片小記Golang
- 陣列小記陣列
- Docker 建站小記Docker
- Java集合小記Java
- JavaScript 小記錄JavaScript
- 負margin小記
- top使用小記
- 程式生涯小記
- linux小記Linux
- java小記-scannerJava
- git submodule小記Git
- 數論小記
- 博弈論小記
- 小程式專案之填坑小記
- 索引儲存小記索引
- PyCharmforMac快捷鍵小記PyCharmORMMac
- 前端小bug記錄前端
- 小程式-記牌器
- Java常用小筆記Java筆記
- java學習小記Java
- Dockerfile 小記之FROMDocker
- C#小筆記C#筆記
- MQ學習小記MQ
- 前端面試小記前端面試