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);

QSizeGrip是一个用于定制窗口大小调整手柄的类。它支持width、height和image属性,可以通过设置这些属性来自定义手柄的外观。例如,可以使用image属性来指定手柄的图像,使用width和height属性来设置手柄的大小。下面是一个QSizeGrip的使用示例: ```css QSizeGrip { image: url(E:/1.jpg); width: 16px; height: 16px; } ``` 这个示例中,我们使用了一个名为"1.jpg"的图像作为手柄的图像,并将手柄的宽度和高度设置为16像素。通过这样的设置,我们可以自定义QSizeGrip的外观,使其符合我们的需求。\[1\] #### 引用[.reference_title] - *1* *3* [qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)](https://blog.youkuaiyun.com/qq21497936/article/details/79424536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [最简单的方式实现QML无边框窗口边缘拖动调整大小](https://blog.youkuaiyun.com/luoyayun361/article/details/122885846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值