当前位置: 首页 > news >正文

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

相关文章:

  • Oracle创建表空间,添加用户及授权
  • sqlserver字符串拆分(split)方法汇总
  • Pycharm配置autopep8让Python代码更符合pep8规范
  • Union和Union All到底有什么区别
  • SQL——多行并成一行显示, 以字符串分隔(相当于C#中的join)
  • angular1.5 与 angular5 组件的对比
  • maven搭建ssm框架是使用最新mysql 6.0jar遇到的问题
  • 新旧数据ICD的整合
  • linux-ftp install
  • 总结2011,展望2012
  • [ZJOI 2014]力
  • 不辜负每一个日出——Leo2012寄语
  • 微信小程序笔记
  • 索引以及索引缓冲区
  • Case when用法
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • angular2开源库收集
  • ERLANG 网工修炼笔记 ---- UDP
  • input实现文字超出省略号功能
  • JavaScript对象详解
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS学习笔记——闭包
  • PAT A1092
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 欢迎参加第二届中国游戏开发者大会
  • 面试遇到的一些题
  • 浅谈web中前端模板引擎的使用
  • 深度解析利用ES6进行Promise封装总结
  • 深度学习中的信息论知识详解
  • 数据可视化之 Sankey 桑基图的实现
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信公众号开发小记——5.python微信红包
  • 小试R空间处理新库sf
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 进程与线程(三)——进程/线程间通信
  • 浅谈sql中的in与not in,exists与not exists的区别
  • $().each和$.each的区别
  • (007)XHTML文档之标题——h1~h6
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)elasticsearch 源码之启动流程分析
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)Linux+Windows下安装ffmpeg
  • ***详解账号泄露:全球约1亿用户已泄露
  • .CSS-hover 的解释
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net的DataSet直接与SQL2005交互
  • .net解析传过来的xml_DOM4J解析XML文件