实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放

news2024/10/6 18:22:42
实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放

新建一个窗口,我想在这个窗口上放一个QWidget,并且这个QWidget能够布满整个窗口,还可以随着随鼠标的拖动自动缩放

1、首先给大家介绍一个好用的组件库:qt-material-widgets

(1)开源地址(基于QWidgets)

https://github.com/laserpants/qt-material-widgets

基于Qt Quick(QML)可以参考以下开源项目:

https://github.com/uwerat/qskinny

(2)静态库文件准备

  • 先把项目的源码clone 下来,然后双击qt-material-widgets.pro 使用Qt creator打开
  • 构建Debug生成静态库文件 libcomponents.a 路径(build-qt-material-widgets-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\components\debug\libcomponents.a)
  • 在你的项目里新建文件夹 sdk/material/staticLib
  • 把libcomponents.a复制到 sdk/material/staticLib/libcomponents.a 下面;
  • 把源码的components文件夹整体复制到sdk/material下面;(注意:components文件夹是clone下来源码的qt-material-widgets\components)

(3)在项目中引入库

  • qmake方式 .pro

    #MaterialSDK
    LIBS += $$PWD/sdk/material/staticLib/libcomponents.a
    INCLUDEPATH += $$PWD/sdk/material/components
    PRE_TARGETDEPS += $$PWD/sdk/material/staticLib/libcomponents.a
    
  • CMake方式 CmakeLists.txt

    add_library(
        libcomponents 
        STATIC
        IMPORTED
    )
     set_target_properties(
        libcomponents
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/SDK/Material/lib/libcomponents.a
    )
    
    target_link_libraries(${PROJECT_NAME} PRIVATE libcomponents)
    
    
2、在main.cpp中引入qss文件:
#include "material.h"

#include <QApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    // 引入qss文件
    QFile file(":/style/style.qss");
    if ( file.exists() ) {
        // 以只读的方式打开
        file.open(QFile::ReadOnly);
        // 以字符串的方式保存读出的结果
        QString styleSheet = QLatin1String(file.readAll());
        // 设置全局样式
        qApp->setStyleSheet(styleSheet);
        // 关闭文件
        file.close();
    }
    // 初始化一个material窗口
    Material material;
    // 显示主窗口
    material.show();
    return app.exec();
}

style.qss文件内容如下,给mainWidget加个背景色,便于观察变化

#mainWidget {
  background-color: red;
}

3、新建 material.h文件,内容如下:
#ifndef MATERIAL_H
#define MATERIAL_H

#include <QWidget>
#include <qtmaterialtoggle.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Material; }
QT_END_NAMESPACE

class Material : public QWidget
{
    Q_OBJECT

public:
    Material(QWidget *parent = nullptr);
    ~Material();

private:
    Ui::Material *ui;

protected:
    /* 1、将函数声明为virtual的作用是允许这两个函数在派生类中被重写(override),
     * 因为resizeEvent()和moveEvent()是QWidget类中的虚函数,因此在派生类中也要将其声明为virtual,
     * 这样就可以在派生类中重新定义这两个函数,以实现派生类中对窗口大小改变和窗口移动事件的处理 
     */
    virtual void resizeEvent(QResizeEvent *event);
    virtual void moveEvent(QMoveEvent *event);

private:
    QWidget *mainWidget; // 1、添加mainWidget成员变量


};
#endif // MATERIAL_H

4、新建 material.cpp文件,内容如下:
#include "material.h"
#include "ui_material.h"

#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>

Material::Material(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Material)
{
    ui->setupUi(this);

    // 使用Material-widgets
    QtMaterialToggle *switchToggle = new QtMaterialToggle();
    //switchToggle->setGeometry(50, 50, 164, 96);

    // 1、创建一个QWidget容器
    mainWidget = new QWidget(this);
    // 设置 objectName 属性,QSS 文件中使用 #objectName 来定位到该控件
    mainWidget->setObjectName("mainWidget");
    // 设置widget容器充满整个窗口,并且跟随窗口缩放
    mainWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    mainWidget->setGeometry(0, 0, width(), height());


    // Qt中设置窗体大小的方法
    // 设置它的最大窗口值和最小窗口值,并且使最大值和最小值相等,窗口的最大化按钮将变得不可用
    // mainWidget->setMinimumSize(200, 200);
    // mainWidget->setMaximumSize(200, 200);
    // 后来发现还有一个方法就是 resize,在构造函数中直接调用他设置大小就可以
    //mainWidget->resize( QSize( 1128, 761 ));



    QHBoxLayout *layout = new QHBoxLayout(this);
    QPushButton *button1 = new QPushButton("按钮1");
    QPushButton *button2 = new QPushButton("按钮2");

    layout->addWidget(button1);
    layout->addWidget(button2);
    layout->addWidget(switchToggle);

    layout->setSpacing(60);  // 设置部件间距为60像素
    // Qt::AlignLeft    水平方向靠左
    // Qt::AlignRight   水平方向靠右
    // Qt::AlignHCenter 水平方向居中
    // Qt::AlignTop     垂直方向靠上
    layout->setAlignment(Qt::AlignCenter);

    // 将布局放到mainWidget上
    mainWidget->setLayout(layout);
    // 将布局应用到窗口上
    // this->setLayout(layout);

    //有时候会想让我们的程序窗体固定大小,而该大小是我们在编辑时的大小
    //int width = this->geometry().width();   // 找到该窗体的物理大小
    //int height = this->geometry().height();
    //this->setFixedSize(width,height);       //设置窗体固定大小


    // 设置窗口的大小,微信PC应用是1138x761
    // 设置它的最大窗口值和最小窗口值,并且使最大值和最小值相等,窗口的最大化按钮将变得不可用
    // this->setMinimumSize(1128, 761);
    // this->setMaximumSize(1128, 761);
    // 后来发现还有一个方法就是 resize。在构造函数中直接调用他设置大小就可以
    //this->resize( QSize( 1128, 761 ));


    // 将容器添加到主窗口中
    //this->setCentralWidget(widget);

    this->setWindowTitle("QWidget布局");


}

Material::~Material()
{
    delete ui;
}

/* 2、如果要实现widget窗口跟随鼠标拖动并自动跟随窗口缩放,
 * 需要在QWidget类中重写resizeEvent()函数和moveEvent()函数
 */
// 在resizeEvent()函数中,重新设置widget窗口的大小和位置
void Material::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event); // 调用父类的resizeEvent()函数
    if(this->mainWidget) // 判断是否有widget被添加到Material窗口中
    {
        // 获取Material窗口的大小
        int w = this->width();
        int h = this->height();
        // 设置widget的大小为Material窗口的大小
        this->mainWidget->setGeometry(0, 0, w, h);
    }
}

// 在moveEvent()函数中,重新设置widget窗口的位置
void Material::moveEvent(QMoveEvent *event)
{
    QWidget::moveEvent(event);
    if(this->mainWidget)
    {
        this->mainWidget->move(0, 0);
    }
}



5、效果展示
请添加图片描述

6、完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lighthouse尘埃粒子计数器3100/3350参数资料

​​SOLAIR 3350集成了我们的超长寿命激光二极管技术传感器&#xff0c;可生产业界比较长的激光二极管寿命20年以上(基于连续24/7运行)。使用一个新的&#xff0c;更轻的延长寿命的电池和外部交流适配器&#xff0c;SOLAIR 3350更加便携。SOLAIR 3350具有业界最好的用户界面(UI…

springboot+java拍卖竞拍网站系统idea

书画拍卖网站系统的设计与实现的设计思想如下&#xff1a; Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行…

10个学习Python的理由以及Python的优势有哪些?

Python的由来 Python的创始人是吉多范罗苏姆&#xff0c;1989年他在阿姆斯特丹的CWI工作&#xff0c;圣诞节期间&#xff0c;吉多范罗苏姆为了打发圣诞节的无聊&#xff0c;决定开发一个新的脚本解释程序&#xff0c;作为ABC 语言的一种继承。之所以选择Python作为编程语言的名…

新星计划|记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)

文章目录 1 前言2 注册小程序账号3 安装微信开发者工具4 安装Nodejs和HBuilderX4.1 windows用户安装Nodejs4.2 macos/linux用户安装Nodejs4.3 安装HBuilder X 5 创建项目5.1 新建一个项目5.2 进行基本配置 6 HBuilderX同步微信开发者工具6.1 打开服务端口6.2 调用微信开发者工具…

不能使用ChatGPT 试试基于2021模型的 Claude (原GPT团队二次创业产品)聊天机器人 更详细的解答

大家过程中遇到问题都可以私信我 注册方式&#xff0c;引用别人的&#xff1a;用不了chatgpt&#xff0c;试试Claude-Claude注册教程_大数据食铁兽的博客-CSDN博客 不过上面作者没有写坑&#xff0c;只支持少部分国家&#xff08;我选用的日本&#xff0c;Claude官网会提示你…

【HarmonyOS】这些HarmonyOS应用开发的问题你都了解吗?

【关键字】 HTTP请求、requests exceeds 100、DNS域名解析、屏幕分辨率、ArkTS/JS 【问题描述1】 HTTP多次请求之后出现请求异常如何解决&#xff1f; 描述&#xff1a;接口是正常的&#xff0c;http多次请求出现提示“The requested has been canceled or the number of re…

mysql高阶语句与连接存储

文章目录 一、mysql高阶语句1.按照关键字进行排序2.多字段排序3.对查询的结果进行分组4.限制结果条目5.设置别名&#xff08;alias----》as&#xff09; 二、mysql连接与存储1.、连接查询2.存储过程 总结 一、mysql高阶语句 1.按照关键字进行排序 ​使用select语句可以将需要…

古鱼、恐龙和大众,相逢在百度百科的“彩虹桥”

提起孩子的天性&#xff0c;我们会想到什么&#xff1f; 首先是好奇心。 如果没有好奇心和求知欲作为动力&#xff0c;人类不可能产生那些给社会带来巨大价值的发明创造。对于个人来说&#xff0c;带着对万物的好奇&#xff0c;了解大千世界的丰富多彩&#xff0c;以后无论遇到…

Docker基础篇(上)

1、为什么Docker比VM快 2、帮助启动类命令 启动类命令 启动docker&#xff1a; systemctl start docker停止Docker&#xff1a; systemctl stop docker重启Docker&#xff1a; systemctl restart docker查看状态&#xff1a; systemctl status docker设置开机自启&#x…

【C++】20.异常

1.C语言处理错误方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到er…

【003】C++数据类型之整型类型(int)详解

C数据类型之整型变量详解 引言一、常量和变量二、整形常量三、整形变量的定义四、整型变量的初始化五、整型变量的声明5.1、C 变量的定义、变量的声明、变量的使用三者的关系 六、键盘&#xff08;输入设备&#xff09;给变量赋值七、案例&#xff1a;键盘获取两个int数值然后求…

win11+VS2019下配置PCL1.11.1

1、PCL安装配置 下载pcl-1.11.1-pdb-msvc2019-win64与PCL-1.11.1-AllInOne-msvc2019-win64.exe文件。以管理员身份运行PCL-1.11.1-AllInOne-msvc2019-win64.exe程序&#xff0c;截图如下&#xff1a; 安装过程中没有弹出OpenNI2的安装&#xff0c;但是要安装在3rdParty下&#…

快速了解toRaw和markRaw的用法

toRaw toRaw&#xff0c;将响应式对象&#xff08;由 reactive定义的响应式&#xff09;转换为普通对象。 作用&#xff1a;将一个由reactive生成的响应式对象转为普通对象。使用场景&#xff1a;用于读取响应式对象对应的普通对象&#xff0c;对这个普通对象的所有操作&…

mongo基本操作---文档的增删改查

4、CRUD mongo数据库和平时常见的关系型数据库一样&#xff0c;最基本的操作就是增删改查&#xff0c;唯一的区别就是叫法不一样 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域…

韦东山Linux驱动入门实验班(1)hello驱动

前言 &#xff08;1&#xff09;学习韦东山老师的Linux&#xff0c;因为他讲的很精简&#xff0c;以至于很多人听不懂。接下来我讲介绍韦东山老师的驱动实验班的第一个Hello程序。 &#xff08;2&#xff09;注意&#xff0c;请先学习完视频再来看这个教程&#xff01;本文仅供…

AD9680+JESD204B接口+FPGA FMC高速率数据采集板卡

板卡概述&#xff1a; 【FMC_XM155】 FMC_XM155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。 该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用…

CIE颜色空间LCh、Lab、XYZ介绍与转换关系(包含源码)

项目场景&#xff1a; 提示&#xff1a;在颜色科学中&#xff0c;LCh和Lab是比较常用的 LCh是由MATLAB计算出的数据&#xff0c;但是我所需要在Qt的q3dsurface绘制出这个切面&#xff0c;看了Qt官方Examples&#xff0c;墨西哥草帽算法的3D模型就是由XYZ组成的。所以我需要LC…

【c语言】组件化打包—静态库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

MacOS使用Parallels Desktop安装win11虚拟机

文章目录 前话一、安装Parallels Desktop二、安装Windows11虚拟机1.win11镜像下载2.虚拟机启动 三、创建过程问题解决1.安装win11系统的时候不显示网路2.系统安装完成后无法连接网络 三、参考文献 前话 为了让大家能快速获取到需要的内容&#xff0c;这里提前说明一下本文适用…

杂记——23.java中的值传递和应用传递

这篇文章我们来讲一下java中的值传递和引用传递 结论&#xff1a;java中只存在值传递&#xff0c;不存在引用传递&#xff08;C中有引用传递&#xff09; 分析&#xff1a; 值传递(pass by value)&#xff1a;在调用函数时&#xff0c;将实际参数复制一份传递到函数中&#…