QWidget类-一些让窗口变大变小的东东

今天开始就不称小白了,虽然在qt学习中还是入门。但好歹发了这么多,add(今天真的很开心)

1.QWidget

平常生活中我们都是见过弹窗的,QWidget默认的函数很多,我们来看一下。

老样子,先来三个按钮,分别表示:最大化,最小化,关闭

//用auto主要是方便,大家也不要忘了原本的命名方式

    auto m_btn=new QPushButton("按钮",this);
    auto closeBtn=new QPushButton("X",this);
    auto miniBtn=new QPushButton("-",this);
    auto maxBtn=new QPushButton("大",this);

//给他们设置大小,位置,这里没有用ui设计,全是手打的

    closeBtn->setFixedSize(40,40);
    miniBtn->setFixedSize(40,40);
    maxBtn->setFixedSize(40,40);
    flushBtn->setFixedSize(40,40);


    closeBtn->move(600,0);
    miniBtn->move(560,0);
    maxBtn->move(520,0);
    flushBtn->move(480,0);

//看一下效果,为什么我们的是无边框的呢?

是因为

 setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);

我们去掉了边框和拉伸,我们在前面的学习中,自己设计过一个qq界面所以当然要去边框了

2.实现功能

(1)常见的功能有哪些呢,我们先来看看关闭(close)

    connect(closeBtn, &QPushButton::clicked, [=]
            {
                close();
            });

用我们的槽函数来处理按钮点击消息,然后再lamda表达式中调用,close函数。

(2)我们来看第二个,最大化。我们在平时使用窗口时,是不是最大化点完后,再点一下就可以回到原来的大小呢?

    connect(maxBtn, &QPushButton::clicked, [=]
            {
                //如果窗口是最大化的,恢复正常显示
                if (isMaximized())
                {

//正常显示
                    showNormal();
                }
                //如果窗口不是最大化的,那就最大化
                else
                {
                    showMaximized();
                }
            });

(3)然后就是最小化了,调用的是 showMinimized()函数

    connect(miniBtn, &QPushButton::clicked, [=]
            {
                showMinimized();
            });

(4)最后既然讲到窗口了,我们就来看看窗口的切换是如何实现的把

    QPointer<QWidget> subWindow;

这是什么呢,这是qt的指针<>中的是指针的类型,这里我们创建了一个QWidget的指针,也就是我们的新窗口啦。

当然在我们的构造函数中也是要给他构造一下的熬。

我们来看这几行代码,因为平时我们都是单个窗口进行构造,所以习惯了直接写函数(这是c++的特色),但当有新的对象进来后,一定记得要给指针熬,然后我们来运行一下。

是不是出现了两个窗口呢,那为什么小窗口在左上角呢,是因为我们给他设定了几何位置。

subWindow->setGeometry(0, 0, 200, 200);参数从左到右分别是 x,y,width,height

注意看show是主窗口show,hide是subWindow隐藏这就实现了切换。

    auto newbtn=new QPushButton("我也是按钮",subWindow);
    connect(newbtn,&QPushButton::clicked,this,[=]()
            {
        this->show();
        subWindow->hide();
    });

(5)窗口的拖拽

通常我们是鼠标左键点击后,拖动整个窗口移动。所以我们要使用鼠标事件,值得注意的时,我们需要获取相对位移,因为要拖拽这个窗口自然是要计算窗口和屏幕的位移,让它和鼠标的位移一致。

    void mousePressEvent(QMouseEvent * event)
    {
        mouse_pos = event->globalPos();// 窗口左上角到鼠标的距离
        window_pos = this->pos();// 从windows左上角到窗口左上角的距离
        diff_pos = mouse_pos - window_pos;
    }

    void mouseMoveEvent(QMouseEvent* event)
    {
        QPoint pos = event->globalPos();// 鼠标相对于桌面的绝对位置
        // this->move(pos);// 不能直接移动
        this->move(pos - diff_pos);

    }

    QPoint diff_pos;// 鼠标和窗口的相对位移
    QPoint window_pos;
    QPoint mouse_pos;
 

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值