Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口
一、简介
最近看到一篇Qt实现伸缩滑动的窗口的文章,但其代码不完整。便在此重新书写了完整的代码,并开源出来。窗口的中央有滑动条可以动态改变子窗口的大小,隐藏的按钮可以快速伸缩子窗口。其效果图如下:
二、详解
1、代码
(1)slidingwindow.h
- #ifndef SLIDINGWINDOW_H
- #define SLIDINGWINDOW_H
- #include <QtGui>
- class SlidingWindow : public QWidget
- {
- Q_OBJECT
- public:
- 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)若有问题或建议,请留言,在此感谢!
http://blog.csdn.net/taiyang1987912/article/details/50717179
Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口的更多相关文章
- QSplitter实现自由伸缩滑动窗口部件(要在m_pSplitter中加入frame_4之前,给frame_4设置样式;之后设置无效)
实现代码如下: #include <QSplitter> QSplitter *m_pSplitter; m_pSplitter = new QSplitter(ui->frame_ ...
- Qt浅谈之四十九俄罗斯方块(代码来自网络)
一.简介 从网上下载了一个Qt实现的俄罗斯方块单机版的源码,觉得非常有意思,故以博客形式记录下来,以便慢慢来研究.在centos6.6下编译运行(注意程序运行需要读取pro目录的配置文件,若把编译目录 ...
- Qt浅谈之十八:GraphicsView框架事件处理(有源码下载)
一.简介 GraphicsView支持事件传播体系结构,可以使图元在场景scene中得到提高了已被的精确交互能力.图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景给相应的图形项. ...
- Qt浅谈之三十九圆形进度条(已经有50篇了)
http://blog.csdn.net/taiyang1987912/article/category/2314763
- Qt浅谈内存泄露(总结)
Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...
- Qt浅谈之总结(整理)
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
- Qt::浅谈信号槽连接,参数在多线程中的使用
Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...
- Qt浅谈之二十App自动重启及关闭子窗口
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
- Qt浅谈之二十App自动重启及关闭子窗口(六种方法)
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
随机推荐
- cocos2d-x 找不到资源文件问题
问题描述: 在项目中引用到了图片,但是运行时报错: Unhandled exception at 0x001049DE in hello.exe: 0xC0000005: Access violati ...
- 高德JAVA笔试题
1.常用的RuntimeException. 2.叙述RuntimeException和一般异常的异同. 3.叙述ArrayList.Vector和LinkedList各自的特点和特性. 4.什么是反 ...
- Java ConcurrentHashmap 解析
总体描述: concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问.而对于每个分段,ConcurrentHashmap采用final和内存可见修饰符Volat ...
- MKMapView and Zoom Levels: A Visual Guide
原帖:http://troybrant.net/blog/2010/01/mkmapview-and-zoom-levels-a-visual-guide/ So, how exactly does ...
- 关于bootstrap--导航栏
1.普通导航:class .nav-tabs. <ul class="nav nav-tabs"> <li class="active"> ...
- 查看android进程信息
打开adb shell.直接ps命令 假设查看某特定进程,比方<圣火英雄传>.用grep过滤 各列參数意义: USER 进程当前用户: PID Pro ...
- eclipse中svn插件的安装与使用
eclipse中svn插件的安装与使用 一. eclipse中svn插件的安装 eclipse里安装SVN插件,一般来说,有两种方式: 直接下载SVN插件,将其解压到eclipse的对应目录里 ...
- php 回调函数
publicfunction transaction(Closure $callback){ $this->beginTransaction(); // We'll simply ...
- HDU 2159 FATE(全然背包+二维费用背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- sql中的case when
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select ...