Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口

2024-03-11 10:18

本文主要是介绍Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

 

        最近看到一篇Qt实现伸缩滑动的窗口的文章,但其代码不完整。便在此重新书写了完整的代码,并开源出来。窗口的中央有滑动条可以动态改变子窗口的大小,隐藏的按钮可以快速伸缩子窗口。其效果图如下:

 

二、详解

1、代码

(1)slidingwindow.h

#ifndef SLIDINGWINDOW_H
#define SLIDINGWINDOW_H#include <QtGui>class SlidingWindow : public QWidget
{Q_OBJECTpublic:SlidingWindow(QWidget *parent = 0);~SlidingWindow();protected:void mousePressEvent ( QMouseEvent * event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void resizeEvent(QResizeEvent *event);bool eventFilter(QObject *obj, QEvent *event);private:void setBtnPos();void setBtnIcon();private slots:void slotClickedBtn();void slotSplitterMoved(int pos, int index);private:QPoint dragPosition;bool bPressFlag;QSplitter *splitter;QFrame *contentFrame;QFrame *listFrame;QPushButton *pushButton;QIcon leftIcon;QIcon rightIcon;
};#endif // SLIDINGWINDOW_H

(2)slidingwindow.cpp

#include "slidingwindow.h"SlidingWindow::SlidingWindow(QWidget *parent): QWidget(parent, Qt::FramelessWindowHint), bPressFlag(false)
{resize(660, 460);splitter = new QSplitter(Qt::Horizontal, this);splitter->setHandleWidth(1);splitter->setStyleSheet("QSplitter::handle{background:#FFFFFF}");contentFrame = new QFrame(splitter);contentFrame->setStyleSheet("background:#000000");contentFrame->resize(475, height());contentFrame->setMinimumWidth(405);listFrame = new QFrame(splitter);listFrame->setStyleSheet("background:#323232");listFrame->resize(660 - 475, height());listFrame->setMaximumWidth(660 - 405);connect(splitter, SIGNAL(splitterMoved(int,int)), this, SLOT(slotSplitterMoved(int,int)));leftIcon = QIcon(":/left.png");rightIcon = QIcon(":/right.png");pushButton = new QPushButton(this);pushButton->setFocusPolicy(Qt::NoFocus);pushButton->hide();pushButton->setFixedSize(13, 42);pushButton->setIconSize(pushButton->size());pushButton->setStyleSheet("border:none;");pushButton->setIcon(rightIcon);pushButton->move(contentFrame->width() - pushButton->width()-2, (contentFrame->height() - pushButton->height())/2);connect(pushButton,SIGNAL(clicked()),this,SLOT(slotClickedBtn()));contentFrame->setMouseTracking(true);listFrame->setMouseTracking(true);contentFrame->installEventFilter(this);listFrame->installEventFilter(this);
}SlidingWindow::~SlidingWindow()
{}void SlidingWindow::resizeEvent(QResizeEvent *event)
{splitter->setGeometry(0, 0, width(), height());move((QApplication::desktop()->width() - width())/2,  (QApplication::desktop()->height() - height())/2);QWidget::resizeEvent(event);
}bool SlidingWindow::eventFilter(QObject *obj, QEvent *event)
{if (event->type() == QEvent::MouseMove) {QMouseEvent *mouseMove = static_cast<QMouseEvent*>(event);QRect rect = pushButton->frameGeometry();if (rect.contains(mouseMove->pos())) {pushButton->show();}else {pushButton->hide();}}return QWidget::eventFilter(obj, event);
}void SlidingWindow::setBtnPos()
{pushButton->move(contentFrame->width() - pushButton->width(), (contentFrame->height() - pushButton->height())/2);
}void SlidingWindow::setBtnIcon()
{if (listFrame->width() != 0) {pushButton->setIcon(rightIcon);}else {pushButton->setIcon(leftIcon);}
}void SlidingWindow::slotClickedBtn()
{QList <int> sizeList;sizeList.clear();if (listFrame->width() != 0) {sizeList.append(660);sizeList.append(0);}else {sizeList.append(475);sizeList.append(660 - 475);}splitter->setSizes(sizeList);setBtnIcon();setBtnPos();pushButton->hide();
}void SlidingWindow::slotSplitterMoved(int pos, int index)
{Q_UNUSED(pos)Q_UNUSED(index)setBtnIcon();setBtnPos();
}void SlidingWindow::mousePressEvent ( QMouseEvent * event)
{bPressFlag = true;dragPosition = event->pos();QWidget::mousePressEvent(event);
}void SlidingWindow::mouseMoveEvent(QMouseEvent *event)
{if (bPressFlag) {QPoint relaPos(QCursor::pos() - dragPosition);move(relaPos);}QWidget::mouseMoveEvent(event);
}void SlidingWindow::mouseReleaseEvent(QMouseEvent *event)
{bPressFlag = false;QWidget::mouseReleaseEvent(event);
}

(3)main.cpp

#include "slidingwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);SlidingWindow w;w.show();return a.exec();
}

(4)编译运行

三、总结

(1)获取位置坐标可以尝试QPoint realPos(QCursor::pos() - this->pos());,这样不用类型转换。主要设置setMouseTracking(true);才能当鼠标不点击时移动鼠标进入mouseMoveEvent事件函数。
(2)源码已上传到csdn:http://download.csdn.net/detail/taiyang1987912/9439233。
(3)若有问题或建议,请留言,在此感谢!

这篇关于Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797521

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、