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

这篇具有很好参考价值的文章主要介绍了实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现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、创建一个mainWidget容器,放到Material窗口上
    mainWidget = new QWidget(this);
    // 设置 objectName 属性,QSS 文件中使用 #objectName 来定位到该控件
    mainWidget->setObjectName("mainWidget");
    // 设置mainWidget的大小策略,就是当窗口大小变化时,mainWidget怎么调整自己的大小,第一个参数是水平方向上的策略,第二个参数是垂直方向上的策略
    mainWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    // 设置mainWidget容器的大小和位置
    mainWidget->setGeometry(0, 0, width(), height());


    // Qt中设置窗体大小的方法
    // 设置它的最大窗口值和最小窗口值,并且使最大值和最小值相等,窗口的最大化按钮将变得不可用
    // mainWidget->setMinimumSize(200, 200);
    // mainWidget->setMaximumSize(200, 200);
    // 后来发现还有一个方法就是 resize,在构造函数中直接调用他设置大小就可以
    //mainWidget->resize( QSize( 1128, 761 ));
  
    // 在mainWidget上创建一个垂直布局,下面的2种方法都可以
    // mainWidget->setLayout(layout);
    QHBoxLayout *layout = new QHBoxLayout(mainWidget);
    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);

    //有时候会想让我们的程序窗体固定大小,而该大小是我们在编辑时的大小
    //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->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、效果展示
实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放

6、完成文章来源地址https://www.toymoban.com/news/detail-497172.html

到了这里,关于实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt之格栅布局(QGridLayout)控件填满整个单元格

    Qt专栏: 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结         今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的: 发现在窗口拉伸的时候,pEdit 不会填满第0行1列的位置,右边有空隙。    

    2024年04月15日
    浏览(61)
  • 【Qt】Qt无边框窗口(鼠标点击自定义标题栏)可拖动

    隐藏掉标题栏后,默认情况下窗口无法被鼠标拖动的,需要自己处理鼠标事件,移动窗口达到拖动效果,但是又不想要鼠标点击整个窗口都可以拖动,只需要鼠标点击自定义的标题栏时可拖动 具体步骤如下: 类外初始化 通过鼠标点击事件,判断鼠标是否在标题栏,如果是,

    2024年02月12日
    浏览(31)
  • QT`实现鼠标超时未点击,窗口自动关闭

    QT 实现鼠标超时未点击,窗口自动关闭 前言 有的时候我们需要某些窗口实现超时自动关闭,但是Qt窗口一般是多部件堆叠而成,如果常规处理,对每一个部件进行鼠标点击事件处理显然不太合理,我个人参考了网上前辈的处理方法,通过直接重新实现 QApplication::notify 函数来

    2024年02月10日
    浏览(34)
  • Qt QWidget 抗锯齿圆角窗口的一个实现方案(支持子控件)

    由于 QWidget::setMask 接口设置圆角不支持抗锯齿,所以通常会使用透明窗口加圆角背景,但圆角背景不能满足对子控件的裁剪,子控件与圆角区域重叠的部分还是能显示出来。当然对于大多数窗口,留出足够的边距也是可以接受。 对一些特殊场景,比如QComboBox的列表框,UI设计

    2023年04月24日
    浏览(44)
  • 纯css实现3D鼠标跟随倾斜

    老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这

    2024年02月08日
    浏览(48)
  • Python 实现鼠标拖动截图

    此功能由3个.py文件实现,分别为:test00.py、screenshot.py、py_tool.py;实现鼠标附近局部放大,未截图部分半透明,鼠标控制键盘精准截图,鼠标框选后自动保存截图,按下esc键退出截图;

    2024年02月14日
    浏览(24)
  • Python实现鼠标拖动的监视

    目录 模块准备 具体步骤  设置监视函数 调用监视器 注意 结束语 这是用来监视鼠标的,pynput模块中还有监视键盘的。         首先,设置一个全局变量,这个全局变量是用来记录鼠标按下和释放的 设置监视函数         注:这里 on_click 函数里面有四个参数,你可以

    2024年02月12日
    浏览(26)
  • CSS实现鼠标跟随 3D 旋转效果,让交互活起来

    一淘模板(56admin.com)给大家介绍一下如何使用CSS实现有意思的鼠标跟随 3D 旋转效果,让交互更加生动,希望对大家有所帮助! 今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现: 简单分析一下,这个交互效果主要有两个核心: 借助了 CSS 3D 的能力 元

    2024年02月10日
    浏览(63)
  • html+css+js实现小红点跟随鼠标移动

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包