• 位置边框深度探索QT窗口系统几何篇2


    每日一贴,今天的内容关键字为位置边框

        上一篇我们介绍了如何获得QT窗口的几何特性,这一篇介绍如何设置窗口的几何特性,窗口的平移,窗口的缩放,如何去掉窗口的边框,如何去掉窗口的标题,如何限定窗口的尺寸,下面一一介绍:

        1.窗口的平移,窗口平移可以用如下两种方法来实现,一是通过move的方法,二是通过setGeometry的方法

    void move(int x, int y)
    void move(const QPoint &pos)
    void setGeometry(int x, int y, int w, int h )
    void setGeometry(const QRect &rect);

     对于采取move的方法来挪动窗口,只能转变窗口的位置,不能转变窗口的大小,窗口的位置包括窗口边框,若窗口无父窗口,则位置坐标(x,y),绝对于电脑屏幕来说的,若窗口有父窗口,则位置坐标(x,y)是绝对于父窗口来说的;对于采取setGeometry的方法来挪动窗口,可以转变窗口的位置的同时,转变窗口的尺寸,窗口的位置不包括窗口边框,若窗口无父窗口,则位置坐标(x,y)绝对于电脑屏幕来说的,若窗口有父窗口,则位置坐标(x,y)绝对于父窗口来说的;我们来看实例:

        (1)采取move的方法,窗口无父窗口

    #include <QtGui/QApplication>
    #include <qwidget.h>
    #include <qdebug.h>
    void print(QWidget *pWidget)
    {
        qDebug() << "pos() = " << pWidget->pos();
    }
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget widget;
        widget.show();
        widget.resize(200, 300);
        widget.move(0, 0);
        print(&widget);
        widget.move(100, 100);
        print(&widget);
        return a.exec();
    }

        widget先move(0,0)到屏幕的左上角,窗口系统的坐标轴x轴正向向右,y轴的正向向下,所以坐标原点在左上角;然后widget挪动到move(100,100)的位置,下面是打印出的位置:

        pos() = QPoint(0,0)

        pos() = QPoint(100,100)

        (2)采取setGeometry 的方法,窗口无父窗口

    #include <QtGui/QApplication>
    #include <qwidget.h>
    #include <qdebug.h>
    void print(QWidget *pWidget)
    {
        qDebug() << "pos() = " << pWidget->pos();
    }
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget widget;
        widget.show();
        widget.resize(200, 300);
        widget.setGeometry(0, 0, 200, 300);
        print(&widget);
        widget.setGeometry(100, 100, 200, 300);
        print(&widget);
        return a.exec();
    }

        我们先来看打印出的结果:

        pos() = QPoint(-4,-30)

        每日一道理
    盈盈月光,我掬一杯最清的;落落余辉,我拥一缕最暖的;灼灼红叶,我拾一片最热的;萋萋芳草,我摘一束最灿的;漫漫人生,我要采撷世间最重的———毅力。

        pos() = QPoint(96,70)

        为什么第一次不是挪动到(0, 0),第二次不是挪动到(100,100)呢?因为通过setGeometry设置的挪动位置不包括边框,而我们打印出来的是边框的位置,参照几何篇一,很快你就知道,4是边框宽度,30是窗口标题高度+边框宽度。

        (3)采取move的方法,窗口有父窗口

    #include <QtGui/QApplication>
    #include <qwidget.h>
    #include <qdebug.h>
    void print(QWidget *pWidget)
    {
        qDebug() << "pos() = " << pWidget->pos();
    }
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget parentWidget;
        QPushButton *ppbTest = new QPushButton("test button", &parentWidget);
        parentWidget.show();
        parentWidget.resize(200, 300);
        ppbTest->move(100, 100);
        print(ppbTest);
        ppbTest->move(0, 0);
        print(ppbTest);
        return a.exec();
    }

        ppbTest是parentWidget的子窗口,此次挪动ppbTest,首先挪动位置(100,100)处,然后挪动到(0,0)处,先来看看输出结果:

        pos() = QPoint(100,100)

        pos() = QPoint(0,0)

        位置和边框

        通过下面的输出结果,我们不难得出结论,ppbTest子窗口move位置是绝对父窗口parentWidget来说的,且是绝对父窗口的内容矩形来讲的。

        (4)采取setGeometry的方法,窗口有父窗口

    #include <QtGui/QApplication>
    #include <qwidget.h>
    #include <qdebug.h>
    void print(QWidget *pWidget)
    {
        qDebug() << "pos() = " << pWidget->pos();
    }
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget parentWidget;
        QPushButton *ppbTest = new QPushButton("test button", &parentWidget);
        parentWidget.show();
        parentWidget.resize(200, 300);
    
        ppbTest->setGeometry(100, 100, ppbTest->width(), ppbTest->height());
        print(ppbTest);
        ppbTest->setGeometry(0, 0, ppbTest->width(), ppbTest->height());
        print(ppbTest);
        return a.exec();
    }

        输出结果同(3),为什么呢?不是说setGeometry的挪动起始位置不包括边框吗?怎么输出结果和(3)雷同呢?这是在这里ppbTest没有边框的原因,好了窗口的挪动就介绍到这里了,下节我们介绍窗口的缩放。

    文章结束给大家分享下程序员的一些笑话语录: 神灯新篇
    一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”

    --------------------------------- 原创文章 By
    位置和边框
    ---------------------------------

  • 相关阅读:
    RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V2.9 版本震撼发布
    免费的海量编程中文书籍索引-都是干货【强烈建议收藏】
    SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
    RDIFramework.NET 框架之组织机构权限设置
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
    RDIFramework.NET ━ 9.16 案例模块━ Web部分
    RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分
    RDIFramework.NET ━ 9.14 数据库连接管理 ━ Web部分
    RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3100592.html
Copyright © 2020-2023  润新知